这题我第一次用的是刷全表,结果UVa居然报Runtime error。
试了3次不行,改回直接算。
明明是第一种用的时间少嘛,奇怪...
程序1
#include<stdio.h>
#include<string.h>
#include<ctype.h>
int s[10][10000];
int main()
{
int N;
memset(s,0,sizeof(s));
for(int i = 1; i <= 10000; i++)
{
int last;
last = i;
for(int k=0;k<=9;k++)
{
//if(i == 10 && k == last%10) printf("last=%d s[%d][%d]=%d\n", last,k,i,s[k][i-1]+1);
if(k == last%10) s[k][i] = s[k][i-1]+1;
else s[k][i]=s[k][i-1];
//if(i == 10 && k == 0) printf("last=%d s[%d][%d]=%d\n", last,k,i,s[k][i]);
}
if(i>=10)
{
last /= 10;
for(int k=0;k<=9;k++)
{
if(k == last%10) s[k][i] = s[k][i]+1;
}
}
if(i>=100)
{
last /= 10;
for(int k=0;k<=9;k++)
{
if(k == last%10) s[k][i] = s[k][i]+1;
}
}
if(i>=1000)
{
last /= 10;
for(int k=0;k<=9;k++)
{
if(k == last%10) s[k][i] = s[k][i]+1;
}
}
if(i==10000)
{
last /= 10;
if(i == 10) printf("last= %d\n", last);
for(int k=0;k<=9;k++)
{
if(k == last%10) s[k][i] = s[k][i]+1;
}
}
}
scanf("%d", &N);
while(N--)
{
int n;
scanf("%d", &n);
for(int i = 0; i < 9; i++)
printf("%d ",s[i][n]);
printf("%d\n",s[9][n]);
}
return 0;
}
程序2
#include<stdio.h>
#include<string.h>
#include<ctype.h>
int s[10][10000];
int main()
{
int N;
memset(s,0,sizeof(s));
scanf("%d", &N);
while(N--)
{
int n;
scanf("%d", &n);
memset(s,0,sizeof(s));
for(int i = 1; i <= n; i++)
{
int last;
last = i;
for(int k=0;k<=9;k++)
{
//if(i == 10 && k == last%10) printf("last=%d s[%d][%d]=%d\n", last,k,i,s[k][i-1]+1);
if(k == last%10) s[k][i] = s[k][i-1]+1;
else s[k][i]=s[k][i-1];
//if(i == 10 && k == 0) printf("last=%d s[%d][%d]=%d\n", last,k,i,s[k][i]);
}
if(i>=10)
{
last /= 10;
for(int k=0;k<=9;k++)
{
if(k == last%10) s[k][i] = s[k][i]+1;
}
}
if(i>=100)
{
last /= 10;
for(int k=0;k<=9;k++)
{
if(k == last%10) s[k][i] = s[k][i]+1;
}
}
if(i>=1000)
{
last /= 10;
for(int k=0;k<=9;k++)
{
if(k == last%10) s[k][i] = s[k][i]+1;
}
}
if(i==10000)
{
last /= 10;
if(i == 10) printf("last= %d\n", last);
for(int k=0;k<=9;k++)
{
if(k == last%10) s[k][i] = s[k][i]+1;
}
}
}
for(int i = 0; i < 9; i++)
printf("%d ",s[i][n]);
printf("%d\n",s[9][n]);
}
return 0;
}