@sensitive-cs
2016-11-21T23:24:30.000000Z
字数 1523
阅读 980
历程
今天学习了最长回文子串和高精度乘法,6174问题
#include <stdio.h>
int a[4000];
int main(void)
{
int n;
int i = 0,j = 0;
scanf("%d",&n);
a[0] = 1;
for (i = 2;i <= n;i++)
{
int c = 0;
for (j = 0;j <= 4000;j++)
{
a[j] = a[j] * i + c;
c = a[j] / 10;
a[j] %= 10;
}
}
for (j = 3999;j >= 0;j--) if (a[j]) break;
for (i = j;i >= 0;i--)
printf("%d",a[i]);
printf("\n");
return 0;
}
6174:
#include <stdio.h>
#include <string.h>
int ans[1005];
int get_next(int x)
{
char a[10];
sprintf(a,"%d",x);
int i,j;
int b,c;
int m = strlen(a);
for (i = 0;i < m;i++)
{
for (j = i + 1;j < m;j++)
{
if (a[i] > a[j])
{
char t = a[i];
a[i] = a[j];
a[j] = t;
}
}
}
sscanf(a,"%d",&b);
for (i = 0;i < m / 2;i++)
{
char t = a[i];
a[i] = a[m - 1 - i];
a[m - 1 - i] = t;
}
sscanf(a,"%d",&c);
return c - b;
}
int main(void)
{
int x;
int lenth = 0;
int flag = 1;
scanf("%d",&x);
ans[0] = x;
while (flag)
{
int t = get_next(ans[lenth]);
int j;
for (j = 0;j <= lenth;j++)
{
if (ans[j] == t)
{
flag = 0;
printf("%d -> %d\n",t,t);
break;
}
}
if (flag)
{
ans[++lenth] = t;
printf("%d - >",ans[lenth-1]);
}
}
return 0;
}
这题刘汝佳用的是一个数组就解决问题,貌似我也是,233333,但是解法不一样。。。
想要说明的是对于最长回文字串的下标,采取手算,手算万岁。
Orz,刘汝佳
还有字母重排,算竞78页(远古)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char a[100][20];
void tosard(char *ch)
{
int i,j;
for (i = 0;i < strlen(ch);i++)
{
for (j = i + 1;j < strlen(ch);j++)
{
if (ch[i] > ch[j])
{
char t = ch[i];
ch[i] = ch[j];
ch[j] = t;
}
}
}
}
int main(void)
{
int i = 0,j,k;
char b[20];
while (scanf(" %s",a[i]) != EOF && a[i][0] != '*')
i++;
for (j = 0;j < i;j++)
{
for (k = j + 1;k < i;k++)
{
if (strcmp(a[j],a[k]) > 0)
{
char p[20];
strcpy(p,a[j]);
strcpy(a[j],a[k]);
strcpy(a[k],p);
}
}
}
while (scanf(" %s",b) != EOF)
{
char c[20];
strcpy(c,b);
tosard(c);
for (j = 0;j < i;j++)
{
char d[20];
strcpy(d,a[j]);
tosard(d);
if (strcmp(c,d) == 0)
printf("%s ",a[j]);
}
}
return 0;
}
略显繁琐,lrj的代码用到了qsort,值得学习。