读书人

关于一个C语言的小程序!求解答!该怎

发布时间: 2012-11-10 10:48:51 作者: rapoo

关于一个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";
至于逻辑问题,自己调试一下好了.
[解决办法]

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); } 


[解决办法]

探讨
h_w_m 这位高手
很感谢您写这么多,可是n必须一开始是整数啊,然后对其进行处理,不然这题也就没有难度了。。。
而且也不可以求余的方法,求出每一位。。。。。因为这样显得太笨拙了。。。

读书人网 >C语言

热点推荐