ACM题http://online-judge.uva.es/p/v6/640.html
解答如下:
#include<iostream>
using namespace std;
int main()
{
int i,j;
int valid;
for(i = 1;i <= 100; ++i)
{
valid = 1;
for(j = i;valid; --j)
{
if(j+(j/10)+(j%10) == i)
{
valid = 0;
}
if(j<1||j+9+9 < i)
{
valid = 0;
cout <<i<<endl;
}
}
}
for(i = 101;i <= 1000; ++i)
{
valid = 1;
for(j = i;valid; --j)
{
if(j+(j/100)+((j%100)/10)+(j%10) == i)
{
valid = 0;
}
if(j<100||j+9+9+9 < i)
{
valid = 0;
cout <<i<<endl;
}
}
}
for(i = 1001;i <= 10000; ++i)
{
valid = 1;
for(j = i;valid; --j)
{
if(j+(j/1000)+((j%1000)/100)+((j%100)/10)+(j%10) == i)
{
valid = 0;
}
if(j<1000||j+(9*4) < i)
{
valid = 0;
cout <<i<<endl;
}
}
}
for(i = 10001;i <= 100000; ++i)
{
valid = 1;
for(j = i;valid; --j)
{
if(j+(j/10000)+((j%10000)/1000)+((j%1000)/100)+((j%100)/10)+(j%10) == i)
{
valid = 0;
}
if(j<10000||j+(9*5) < i)
{
valid = 0;
cout <<i<<endl;
}
}
}
for(i = 100001;i <= 1000000; ++i)
{
valid = 1;
for(j = i;valid; --j)
{
if(j+(j/100000)+((j%100000)/10000)+((j%10000)/1000)+((j%1000)/100)+((j%100)/10)+(j%10) == i)
{
valid = 0;
}
if(j<100000||j+(9*6) < i)
{
valid = 0;
cout <<i<<endl;
}
}
}
return 0;
}
这个效率还不错,开始写出来的运行要好几分钟的
优化代码:
-
#include <stdlib.h>
-
#include <stdio.h>
-
#include <string.h>
-
-
int const BOUND = 1000000;
-
-
int main ( int argc, char* argv [] ) {
-
int *cache = ( int* ) malloc ( sizeof ( int ) * BOUND );
-
memset ( cache, 0, sizeof ( int ) * BOUND );
-
-
int i, j, sum, number;
-
for ( i = 1; i <= BOUND; ++i ) {
-
number = i;
-
sum = i;
-
while (number > 0 ) {
-
sum += number% 10;
-
number /= 10;
-
}
-
if ( sum < BOUND ) cache [sum -1 ] = 1;
-
}
-
-
for ( i = 0; i < BOUND; ++i ) {
-
}
-
-
free ( cache );
-
return 0;
-
}