C语言回文数求批改!
答案:5 悬赏:30 手机版
解决时间 2021-01-19 12:15
- 提问者网友:王者佥
- 2021-01-19 05:22
C语言回文数求批改!
最佳答案
- 五星知识达人网友:时间的尘埃
- 2021-01-19 06:13
对两个地方作了点改动,不妨试一下?
void Sum (int a [], int b [])//求和函数
{
int i, Jin = 0;
for (i = 0; i < num; i ++)
{
c [i] = (a [i] + b [i] + Jin) % N;
Jin = (a [i] + b [i] + Jin) / N;
}
if (Jin > 0)
c [num ++] = Jin;
}
Copy (c, nm);
Turn (nm, mn);
Sum (nm, mn);
if(++su>29)break; //这里有改动
}
if (su < 30)
printf ("STEP=%d
", su);
else
printf ("Impossible!
");
system ("pause");
return 0;
}
void Sum (int a [], int b [])//求和函数
{
int i, Jin = 0;
for (i = 0; i < num; i ++)
{
c [i] = (a [i] + b [i] + Jin) % N;
Jin = (a [i] + b [i] + Jin) / N;
}
if (Jin > 0)
c [num ++] = Jin;
}
Copy (c, nm);
Turn (nm, mn);
Sum (nm, mn);
if(++su>29)break; //这里有改动
}
if (su < 30)
printf ("STEP=%d
", su);
else
printf ("Impossible!
");
system ("pause");
return 0;
}
全部回答
- 1楼网友:你哪知我潦倒为你
- 2021-01-19 08:36
感觉你的回文数怎么这么麻烦啊
可以理解成回文字符串啊
char str[8000],str1[8000]
gets(str)
strcpy(str1,str)
strrev(str)
strcmp(str,str1)如果等于0就是回文,不等就不是
中是需要判断一下这个字符串是不是全数字就好了追问要辗转相加 判断啊 还不如直接换成数字追答/*回文数*/
#include
#include
#define N 8000
int main(void)
{
char str[N],str1[N];
int i;
gets(str);
for(i=0;str[i];i++)
if(str[i]<'0'||str[i]>'9')
return printf("不全是数字\n");
strcpy(str1,str);
strrev(str);
printf("%s是回文数\n",strcmp(str,str1)?"不":"");
return 0;
}
你的意思我没听明白,辗转的意思我也不懂,你看看这样怎么样追问我补充上了原题
可以理解成回文字符串啊
char str[8000],str1[8000]
gets(str)
strcpy(str1,str)
strrev(str)
strcmp(str,str1)如果等于0就是回文,不等就不是
中是需要判断一下这个字符串是不是全数字就好了追问要辗转相加 判断啊 还不如直接换成数字追答/*回文数*/
#include
#include
#define N 8000
int main(void)
{
char str[N],str1[N];
int i;
gets(str);
for(i=0;str[i];i++)
if(str[i]<'0'||str[i]>'9')
return printf("不全是数字\n");
strcpy(str1,str);
strrev(str);
printf("%s是回文数\n",strcmp(str,str1)?"不":"");
return 0;
}
你的意思我没听明白,辗转的意思我也不懂,你看看这样怎么样追问我补充上了原题
- 2楼网友:我住北渡口
- 2021-01-19 08:28
能说一下你的思路吗?不怎么懂你的意思。追问把输入的进制数转换成相对应进制的数组 然后判断是否为回文数 不是则循环 将数组变量分别正反相加 计数加一 然后判断 最后输出 我觉得可能是那个函数代码错了 希望能帮忙找下追答问题在于Sum函数,修改后的函数如下。
void Sum (int a [], int b [])//求和函数
{
int i,Jin =0;
//格式转化
int a_[1000] ={0};
int b_[1000] ={0};
for(i=0;i {
a_[i] =a[num-1-i];
b_[i] =b[num-1-i];
}
for(int j=0;j<3000;j++)
c[j] =0; //将c清空
//相加
for(i=0;i {
int sum =a_[i]+b_[i]+Jin;
if( sum <10 )
{
c[i] =sum;
Jin =0;
}
else
{
c[i] =sum%10;
Jin =sum/10;
}
}
if( Jin >0 )
c[i] =Jin;
}追问运行结果不对啊 2 87 结果 step = 3 我原来的算法 结果能输出正确 但是 一些数出错追答试试下面这个吧。
void Sum (int a [], int b [])//求和函数
{
int i,Jin =0;
//格式转化
int a_[1000] ={0};
int b_[1000] ={0};
for(i=0;i {
a_[i] =a[num-1-i];
b_[i] =b[num-1-i];
}
for(int j=0;j<3000;j++)
c[j] =0; //将c清空
//相加
for(i=0;i {
int sum =a_[i]+b_[i]+Jin;
if( sum {
c[i] =sum;
Jin =0;
}
else
{
c[i] =sum%N;
Jin =sum/N;
}
}
if( Jin >0 )
c[i] =Jin;
}追问还是这组数错误
void Sum (int a [], int b [])//求和函数
{
int i,Jin =0;
//格式转化
int a_[1000] ={0};
int b_[1000] ={0};
for(i=0;i
a_[i] =a[num-1-i];
b_[i] =b[num-1-i];
}
for(int j=0;j<3000;j++)
c[j] =0; //将c清空
//相加
for(i=0;i
int sum =a_[i]+b_[i]+Jin;
if( sum <10 )
{
c[i] =sum;
Jin =0;
}
else
{
c[i] =sum%10;
Jin =sum/10;
}
}
if( Jin >0 )
c[i] =Jin;
}追问运行结果不对啊 2 87 结果 step = 3 我原来的算法 结果能输出正确 但是 一些数出错追答试试下面这个吧。
void Sum (int a [], int b [])//求和函数
{
int i,Jin =0;
//格式转化
int a_[1000] ={0};
int b_[1000] ={0};
for(i=0;i
a_[i] =a[num-1-i];
b_[i] =b[num-1-i];
}
for(int j=0;j<3000;j++)
c[j] =0; //将c清空
//相加
for(i=0;i
int sum =a_[i]+b_[i]+Jin;
if( sum
c[i] =sum;
Jin =0;
}
else
{
c[i] =sum%N;
Jin =sum/N;
}
}
if( Jin >0 )
c[i] =Jin;
}追问还是这组数错误
- 3楼网友:罪歌
- 2021-01-19 08:21
1、循环里要有判断跳出才行,否则一直加一直不满足条件可能会导致死循环
2、Impossible后的惊叹号貌似是半角的
代码已AC,仅供参考。。#include
#include
#define MAXSIZE 3000
char *add(char *m, int n)
{
char res[MAXSIZE];
int res_i = 0;
int len = strlen(m);
char *mt = new char[len];
for(int i=0; i
memset(res, 0, sizeof(res));
for(int i=len-1; i>=0; i--)
{
char a, b, c;
if((m[i] >= 'a') && (m[i] <= 'f')) a = m[i] - 'a' + 10;
else if((m[i] >= 'A') && (m[i] <= 'F')) a = m[i] - 'A' + 10;
else a = m[i] - '0';
if((mt[i] >= 'a') && (mt[i] <= 'f')) b = mt[i] - 'a' + 10;
else if((mt[i] >= 'A') && (mt[i] <= 'F')) b = mt[i] - 'A' + 10;
else b = mt[i] - '0';
c = a + b + jw;
jw = c / n;
c = c % n;
res[res_i++] = c;
}
while(jw > 0)
{
res[res_i++] = jw % n;
jw = jw / n;
}
for(int i=0; i
char t = res[i];
res[i] = res[res_i-i-1];
res[res_i-i-1] = t;
}
for(int i=0; i
if((res[i] >= 10) && (res[i] <= 16)) res[i] = res[i] - 10 + 'A';
else res[i] += '0';
}
delete mt;
return res;
}
bool isok(char *m)
{
int len = strlen(m);
for(int i=0; i
if(m[i] != m[len-i-1]) return false;
}
return true;
}
int main()
{
int n;
char m[MAXSIZE];
scanf("%d%s", &n, &m);
int step = 0;
while(!isok(m))
{
strcpy(m, add(m, n));
step++;
if(step > 30) break;
}
if(step <= 30)
{
printf("STEP=%d ", step);
}
else
{
printf ("Impossible! ");
}
return 0;
}追问我只想知道自己那里错了 ..... impossible 的地方是照原题复制的 “!”没错追答感叹号的问题放在一边不谈,你要说是对的那就是对的好了,但循环里大于30次break是必须有的。。另外不知道题目说的16进制A-F一定是大写么,最好小写的a-f也处理一下。然后就是你的Sum函数写的有问题,下一位的进位是那样求的么?差不多就这些吧。。
另外建议你尽量少用全局变量,可读性实在太差了。。(比如你明明把c定义成了全局变量,还把它作为参数带入Check函数,完全没必要。。)
改好的代码已AC,不过超出这里的字数限制,如果你不想自己改的话就随便回复一下,我把改好的代码贴出来。。
- 4楼网友:愁杀梦里人
- 2021-01-19 06:42
你的程序是在判断回文数吗?看了感觉好像什么都不是啊,程序过于啰嗦,且有许多画蛇添足的地方。你的算法错了,要改的话不是在你这个程序里去找错误,而是要完全推倒重做。下面的程序简洁易懂,效率也高,你不妨试试。
#include
int IsHuiWenShu(int data)
{
int s = 0, d = data;
while(d > 0) {
s = s * 10 + d % 10;
d /= 10;
}
return s == data;
}
int main( ) {
int a;
scanf("%d", &a);
if(IsHuiWenShu(a))
printf("Yes\n");
else
printf("No\n");
}追问题目要求任意进制啊追答你的程序是正确的,但你程序的得分并不能只以正确性来给分。和算法的优劣、程序的可读性、健壮性等等都有关。举个简单的例子:设计程序求1+2+3+...+100。以下几个程序的结果应该都是正确的,但得分应该是不一样的。
1
int fun( ) {
int s;
s = 1+2+3+...+100; //中间的那些数字我就不写了
return s;
}
2
int fun(int n) {
if(n <= 0) return 0;
return n + fun(n - 1);
}
3
int fun(int n) {
int s, i;
for(i = 0, s = 0; i < n; i++)
s += i;
return s;
}
4
int fun(int n) {
int s;
s = n * (n + 1) / 2;
return s;
}
人工批阅的话,以上程序的可读性都还不错,只是从算法方面来进行考虑,如果考虑可读性,则有些人写的程序的可读性很差,则得分将更低。
如果是机器批阅,则会从正确性、健壮性、时间效率、空间效率这几个方面进行给分。首先是要求正确的,不正确则0分;其次时间效率,例如题目给出的最大问题规模n为10000,当n<=8000时,你都不超时,但n>8000,你就超时了,则得分当然不能是满分。要解决时间效率必须从算法入手,还有就是尽量减少一些冗余操作,以上4个程序,显然4是最快的。细细读了一下,存在算法问题,sum函数直接对字符进行加运算再求模,这么做的依据是什么?追问但是 用我朋友做的(100分) 测得某些数据 结果不一样 例如 6 87 他输出impossible 而我不是追答这是你没有进行异常检查,6进制怎么存在87这样的数呢?6进制各个数位上的数字必须小于6的哦,如果检查输入不合法,直接“impossible”.就是了。你在main函数中添加一个合法性检查模块就行。
#include
int IsHuiWenShu(int data)
{
int s = 0, d = data;
while(d > 0) {
s = s * 10 + d % 10;
d /= 10;
}
return s == data;
}
int main( ) {
int a;
scanf("%d", &a);
if(IsHuiWenShu(a))
printf("Yes\n");
else
printf("No\n");
}追问题目要求任意进制啊追答你的程序是正确的,但你程序的得分并不能只以正确性来给分。和算法的优劣、程序的可读性、健壮性等等都有关。举个简单的例子:设计程序求1+2+3+...+100。以下几个程序的结果应该都是正确的,但得分应该是不一样的。
1
int fun( ) {
int s;
s = 1+2+3+...+100; //中间的那些数字我就不写了
return s;
}
2
int fun(int n) {
if(n <= 0) return 0;
return n + fun(n - 1);
}
3
int fun(int n) {
int s, i;
for(i = 0, s = 0; i < n; i++)
s += i;
return s;
}
4
int fun(int n) {
int s;
s = n * (n + 1) / 2;
return s;
}
人工批阅的话,以上程序的可读性都还不错,只是从算法方面来进行考虑,如果考虑可读性,则有些人写的程序的可读性很差,则得分将更低。
如果是机器批阅,则会从正确性、健壮性、时间效率、空间效率这几个方面进行给分。首先是要求正确的,不正确则0分;其次时间效率,例如题目给出的最大问题规模n为10000,当n<=8000时,你都不超时,但n>8000,你就超时了,则得分当然不能是满分。要解决时间效率必须从算法入手,还有就是尽量减少一些冗余操作,以上4个程序,显然4是最快的。细细读了一下,存在算法问题,sum函数直接对字符进行加运算再求模,这么做的依据是什么?追问但是 用我朋友做的(100分) 测得某些数据 结果不一样 例如 6 87 他输出impossible 而我不是追答这是你没有进行异常检查,6进制怎么存在87这样的数呢?6进制各个数位上的数字必须小于6的哦,如果检查输入不合法,直接“impossible”.就是了。你在main函数中添加一个合法性检查模块就行。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯