很多题看不明白,还是先从第一题开始吧
我得计算过程是从0开始的到输入的数的统计,即[0, ?x]
比如 输入15
输出
[0]2 [1]8 [2]2 [3]2 [4]2 [5]2 [6]1 [7]1 [8]1 [9]1
欢迎大家指正
代码:
// DigitCount.cpp : Defines the entry point for the console application.
//
//#include "stdafx.h"
#include <iostream>
#include <fstream>
using std::cout;
using std::cin;
using std::endl;
using std::ifstream;
using std::ostream;
using std::ofstream;
//static int digits[10] = {0};
void ShowResult(const int digits[10])
{
for (int i = 0; i < 10; ++i)
{
cout<<'['<<i<<']'<<digits[i]<<'\t';
}
cout<<endl;
}
void Test(unsigned value, int digits[10])
{
// init digits
memset(digits, 0, sizeof(digits));
digits[0] = 1;
unsigned pos = 0, ratio = 1;
unsigned curDigit = value % 10, head = value / 10, tail = 0;
//do
while (head > 0)
{
// calculate current digit and '0' digit
if (curDigit == 0)
{
digits[0] += (head - 1) * ratio + (tail + 1);
}
else
{
digits[0] += head * ratio;
digits[curDigit] += head * ratio + (tail + 1);
}
// calculate y < curDigit
for (unsigned i = 1; i < curDigit; ++i)
{
digits[i] += (head + 1) * ratio;
}
// calculate y > curDigit
for (unsigned i = curDigit + 1; i <= 9; ++i)
{
digits[i] += head * ratio;
}
// update tail, ratio, curDigit, head
tail += ratio * curDigit;
ratio *= 10;
curDigit = head % 10;
head /= 10;
}
// for curDigit == 0
// do noting
// for 0 < y < curDigit
for (unsigned i = 1; i < curDigit; ++i)
{
digits[i] += ratio;
}
// for y = curDigit
digits[curDigit] += tail + 1;
// for y > curDigit
// do nothing
}
void PrintDigits(int digits[10], ostream& os)
{
for (int i = 0; i < 10; ++i)
{
os<<'['<<i<<']'<<digits[i]<<'\t';
}
os<<endl;
}
int main(int argc, char* argv[])
{
int digits[10] = {0};
const char* INPUTFILE = "in.txt";
const char* OUTPUTFILE = "out.txt";
ifstream is(INPUTFILE);
ofstream os(OUTPUTFILE);
unsigned value = 0;
int testCount = 0;
is>>testCount;
while (--testCount > 0)
{
is>>value;
Test(value, digits);
//Debug_Test(value, digits);
PrintDigits(digits, os);
// print result in console
//PrintDigits(digits, cout);
}
os.close();
is.close();
return 0;
}