关于一个C语言的小程序!求解答!该怎么解决
关于一个C语言的小程序!求解答!
首先是一个小程序题,
题目:请在整数n=742683613984中删除8个数字,使得余下的数字按原次序组成的新数最小。要求如下:
(1)整数n和删除数字的个数“8”在源程序中完成赋值,程序直接输出运行结果;
(2)程序结果输出先后被删除的数字(之间以逗号分隔)和删除后所得的最小数。
(提示:整数n可以以字符数组的方式定义、赋值和处理)
然后是我自己写的代码:
#include<stdio.h>
#include<string.h>
void main()
{
long n = 742683613984;
int i, j;
char a[12];
sprintf(a, "%d", n);
char temp[1] = "0";
for(i=8; i<12; i++)
{
for(j=8; j<12-i; i++)
{
if( (int)a[j] >= (int)a[j+1] )
{
strcpy(temp, a+j+1);
strcpy(a+j+1, a);
strcpy(a+j, temp);
}
}
}
printf("删除的8个数为前八位和删除后的最小数\n");
for(i=0; i<8; i++)
{
printf("%c", a[0]);
}
printf(", ");
for(j=8; j<12; j++)
{
printf("%c");
}
}
不过不知道怎么回事,出错了
D:\6A_2.c(7) : warning C4305: 'initializing' : truncation from 'const __int64 ' to 'long '
D:\6A_2.c(11) : error C2143: syntax error : missing ';' before 'type'
D:\6A_2.c(19) : error C2065: 'temp' : undeclared identifier
D:\6A_2.c(19) : warning C4047: 'function' : 'char *' differs in levels of indirection from 'int '
D:\6A_2.c(19) : warning C4024: 'strcpy' : different types for formal and actual parameter 1
D:\6A_2.c(21) : warning C4047: 'function' : 'const char *' differs in levels of indirection from 'int '
D:\6A_2.c(21) : warning C4024: 'strcpy' : different types for formal and actual parameter 2
Error executing cl.exe.
不知道错在哪。。。
然后就是顺便问下,转换的问题了,主要是整数转字符,字符转整数的,整型数组转整数的(把数组里面的数连接起来)
跪求答案。。。。。。真心感谢了
6A_2.exe - 2 error(s), 5 warning(s)
------解决方案--------------------
首先第一点:将6A_2.c修改成6A_2.cpp;
然后将
char temp[1] = "0";
改成
char temp[64] = "0";
至于逻辑问题,自己调试一下好了.
------解决方案--------------------
首先是一个小程序题,
题目:请在整数n=742683613984中删除8个数字,使得余下的数字按原次序组成的新数最小。要求如下:
(1)整数n和删除数字的个数“8”在源程序中完成赋值,程序直接输出运行结果;
(2)程序结果输出先后被删除的数字(之间以逗号分隔)和删除后所得的最小数。
(提示:整数n可以以字符数组的方式定义、赋值和处理)
然后是我自己写的代码:
#include<stdio.h>
#include<string.h>
void main()
{
long n = 742683613984;
int i, j;
char a[12];
sprintf(a, "%d", n);
char temp[1] = "0";
for(i=8; i<12; i++)
{
for(j=8; j<12-i; i++)
{
if( (int)a[j] >= (int)a[j+1] )
{
strcpy(temp, a+j+1);
strcpy(a+j+1, a);
strcpy(a+j, temp);
}
}
}
printf("删除的8个数为前八位和删除后的最小数\n");
for(i=0; i<8; i++)
{
printf("%c", a[0]);
}
printf(", ");
for(j=8; j<12; j++)
{
printf("%c");
}
}
不过不知道怎么回事,出错了
D:\6A_2.c(7) : warning C4305: 'initializing' : truncation from 'const __int64 ' to 'long '
D:\6A_2.c(11) : error C2143: syntax error : missing ';' before 'type'
D:\6A_2.c(19) : error C2065: 'temp' : undeclared identifier
D:\6A_2.c(19) : warning C4047: 'function' : 'char *' differs in levels of indirection from 'int '
D:\6A_2.c(19) : warning C4024: 'strcpy' : different types for formal and actual parameter 1
D:\6A_2.c(21) : warning C4047: 'function' : 'const char *' differs in levels of indirection from 'int '
D:\6A_2.c(21) : warning C4024: 'strcpy' : different types for formal and actual parameter 2
Error executing cl.exe.
不知道错在哪。。。
然后就是顺便问下,转换的问题了,主要是整数转字符,字符转整数的,整型数组转整数的(把数组里面的数连接起来)
跪求答案。。。。。。真心感谢了
6A_2.exe - 2 error(s), 5 warning(s)
------解决方案--------------------
首先第一点:将6A_2.c修改成6A_2.cpp;
然后将
char temp[1] = "0";
改成
char temp[64] = "0";
至于逻辑问题,自己调试一下好了.
------解决方案--------------------
- C/C++ code
#include<stdio.h> #include<string.h> void main() { long n = 742683613984; int i, j; char a[12]; char temp[64] = "0"; sprintf(a, "%d", n); for(i=8; i<12; i++) { for(j=8; j<12-i; i++) { if( (int)a[j] >= (int)a[j+1] ) { strcpy(temp, a+j+1); strcpy(a+j+1, a); strcpy(a+j, temp); } } } printf("删除的8个数为前八位和删除后的最小数\n"); for(i=0; i<8; i++) { printf("%c", a[0]); } printf(", "); for(j=8; j<12; j++) { printf("%c"); } }
------解决方案--------------------
没看懂你的算法,其它问题可以指正一下:
long n = 742683613984; //<<< long型装不下这个大数,得用 long long int 也就是 __int64类型才装得下
char a[12]; //<<<长度不足,差了一个字符长度,因为有一个结束\0
sprintf(a, "%d", n);//<<< "%d"格式只会打出int,不出打出 __int64 型
不如一开始就定义成串型:
char a[] = "742683613984";// 这样就不必常量数转存整数变量,又转成字符
------解决方案--------------------
按你的题意,我自己写个算法:
- C/C++ code
#include<stdio.h> char delfun(char arr[]) { char ret; int i; ret = arr[0]; if(arr[0]=='\0') return ret; if(arr[1]=='\0') { arr[0]='\0'; return ret; } i=0; do { if(arr[i]>arr[i+1]) { ret = arr[i]; strcpy(&arr[i],&arr[i+1]); return ret; } else i++; }while(1); return 0; } void main() { char a[23] = "742683613984"; char temp[23] = {0}; int i,k = 8; printf("请输入一个大的整数:"); scanf("%22[0-9]",a); fflush(stdin); printf("请输入要删除的数字个数(1-%d):",strlen(a)-1); scanf("%2d",&k); for(i=0; i< k; i++) { temp[i] = delfun(a); printf("当前删除数字:%c,得到最小数:%s\n",temp[i],a);//输出以便验证算法 } printf("删除的%d个数次序及删除后的最小数为\n",k); for(i=0; i<k; i++) { printf("%c,",temp[i]); } printf("%s",a); }