简单的C语言问题,求秒杀
答案:7 悬赏:0 手机版
解决时间 2021-11-21 19:25
- 提问者网友:我们很暧昧
- 2021-11-21 04:49
简单的C语言问题,求秒杀
最佳答案
- 五星知识达人网友:低音帝王
- 2021-11-21 05:00
请确认这个数:“它的位数小于等于一百万”,还是大小小于一百万?
如果是前者,有可能是大数,超了整数表示的范围
具体算法上,下面这段是没用的,直接拿x%9就可以得到结果,因为你前面x等于这个数字的各位数之和,那么这个数整除九之后的余数 就等于 这个数字的各位数之和整除9之后的余数,即x%9
while(x>=10)
{
temp=x;
x=0;
while(temp!=0)
{
x=x+temp%10;
temp=temp/10;
}
}追问这个删除后我有提交了一次,还是wrong answer
不过好像有点知道哪里错了==追答嗯,剩余就是输入输出的问题了,不难的,自己再琢磨下试试追问额,希望破灭了,我还以为是第一遍进行相加的时候long型数据承受不了那个值,(比如说有100万-1位的9进行求余)结果把你调出来的程序调入到第一个循环里,结果还是不对==追答我始终认为你的主要问题还是在输入输出上,对acm题最好不要getchar之类的,用scanf和printf。
另外用char一次性申请内存有助于降低程序复杂度,
修改后如下:
#include
int main(){
int num;
char ch[1000002];
scanf("%d",&num);
while(num--)
{
long x=0;
scanf("%s",ch);
char *p=ch;
while(*p)
{
x=*p-'0'+x;
p++;
}
printf("%ld\n",x%9);
}
return 0;
}
如果是前者,有可能是大数,超了整数表示的范围
具体算法上,下面这段是没用的,直接拿x%9就可以得到结果,因为你前面x等于这个数字的各位数之和,那么这个数整除九之后的余数 就等于 这个数字的各位数之和整除9之后的余数,即x%9
while(x>=10)
{
temp=x;
x=0;
while(temp!=0)
{
x=x+temp%10;
temp=temp/10;
}
}追问这个删除后我有提交了一次,还是wrong answer
不过好像有点知道哪里错了==追答嗯,剩余就是输入输出的问题了,不难的,自己再琢磨下试试追问额,希望破灭了,我还以为是第一遍进行相加的时候long型数据承受不了那个值,(比如说有100万-1位的9进行求余)结果把你调出来的程序调入到第一个循环里,结果还是不对==追答我始终认为你的主要问题还是在输入输出上,对acm题最好不要getchar之类的,用scanf和printf。
另外用char一次性申请内存有助于降低程序复杂度,
修改后如下:
#include
int main(){
int num;
char ch[1000002];
scanf("%d",&num);
while(num--)
{
long x=0;
scanf("%s",ch);
char *p=ch;
while(*p)
{
x=*p-'0'+x;
p++;
}
printf("%ld\n",x%9);
}
return 0;
}
全部回答
- 1楼网友:酒安江南
- 2021-11-21 11:26
能推荐几个群么?yy也可以啊追答在你的qq里面群搜索,关键字为“c语言”就行 ,自己找吧,很多的里面很多人还是愿意回答的。追问主要是不知道加哪个好,以前都加了好几个群,额。。。有点小失望,不然就是不让我进,不然就是那个那个的,,,,
我不挑三拣四。。。别误会,找不到好的群 》。《追答下午回来给你看吧!应该能够搞定。我也还没有加c语言群,先睡觉下午有课。
- 2楼网友:夜余生
- 2021-11-21 09:55
说得不清楚,数字小于1百万位?还是八位?最好举例子说明;还有就是家才语言群。高手很多;追问数字的位数小于100万位
打个比方
2347928349273423649283653287462374092813235445646576574747
求9的余数==
打个比方
2347928349273423649283653287462374092813235445646576574747
求9的余数==
- 3楼网友:骨子里都是戏
- 2021-11-21 09:35
呃,是我理解错了!确实是各个位上的数相加结果整除9就可以了!
while(x>=10)
{...
}
去掉这个外面的循环就行了吧!直接求%9咯!追问
while(x>=10)
{...
}
去掉这个外面的循环就行了吧!直接求%9咯!追问
额。。。。。。。。
不行,long这个整数如果存储不了那个数据也会溢出的(假设全部都是8的一个那么长的数,加起来也不差那几位)
代码主要是第二次的代码,不过还是不通过
追答嗯,确实有这个结论!是我先搞错了- -!Sorry哈- 4楼网友:从此江山别
- 2021-11-21 08:19
借用楼主代码,先写个处理余数函数就行。另外设置一个数组用来存储每次输入的数求余后的结果,因为你要最后输出。当然用动态指针申请空间存储也行。
我认为最关键是要每次求和之后也进行求余,这样不至于太大超出int范围。
写完发现和 __angelfish| 说的差不多。只不过他一下子申请超大内存重复操作不太可取。
#include
#define N 100
int MOD(long num)
{
int result=0;
while(num)
{
result+=(num%10);
num/=10;
result%=9;
}
return result;
}
int main()
{
char ch;
int i=0,num;
long x;
int a[N];
scanf("%d",&num);
getchar();
while(num--)
{
x=0;
ch=getchar();
while(ch!='\n')
{
x=ch-'0'+x;
ch=getchar();
}
a[i]=MOD(x);
i++;
}
num=i;
for(i=0;i printf("%d\n",a[i]);
return 0;
}
我认为最关键是要每次求和之后也进行求余,这样不至于太大超出int范围。
写完发现和 __angelfish| 说的差不多。只不过他一下子申请超大内存重复操作不太可取。
#include
#define N 100
int MOD(long num)
{
int result=0;
while(num)
{
result+=(num%10);
num/=10;
result%=9;
}
return result;
}
int main()
{
char ch;
int i=0,num;
long x;
int a[N];
scanf("%d",&num);
getchar();
while(num--)
{
x=0;
ch=getchar();
while(ch!='\n')
{
x=ch-'0'+x;
ch=getchar();
}
a[i]=MOD(x);
i++;
}
num=i;
for(i=0;i
return 0;
}
- 5楼网友:愁杀梦里人
- 2021-11-21 07:37
追答1) char bigNumber 是全局变量,可以申请到那么大的。
2) 因为是全局变量,只会被分配一次。
3)为了保存最大的数字(100万位)必须这么大,不存在浪费的问题。
4)一般程序的内存限制 65535 KB,char bigNumber[1000002] 只占 976KB左右,不会超内存限制的。
5)我的程序不止可以计算和 9 取余数的问题,可以计算和【任意数字(int 范围内)】取余数的问题。
6)和 9 取余数的问题,可以等价于和各位数字和取余数的问题,我看了你的归纳证明法时对的。
因此可以对和 9 取余数的问题特别设计。如:
#include
int main(int argc, char *argv[])
{
int T;
char ch;
int remainder;
scanf("%d",&T);
fflush(stdin);
while(T--)
{
remainder = 0;
while((ch=getchar())!='\n')
{
remainder = (remainder + (ch-'0')) % 9;
}
printf("%d\n",remainder);
}
return 0;
}追问全局变量只申请一次,这个确定
虽然可以理论通过(代码看过了,不过没有提交哦),不过,我觉得还是不太好哦
第一,100w的空间首先来说过于庞大,虽按照你的说法能够申请和空间不溢出,但是毕竟现在程序都是寻求最优代码的(小,快,精)
第二,太慢,100w对于这个题目来说不是小数目啊
我们的思路其实一致的,运行时间大概相同
但我的一接受就进行转型和进行预算,最后得结果
不需要占用那么多的资源追答1)100w 字节还不到 1M,对现在的计算机来说不大的。
2)我说过了你的算法是针对特殊数据 9 的,而我的是针对任意数字的。你的程序有专对性,而我的有通用性。
3)你以后会碰到需要开辟这么大空间的题目的,相信我。
2) 因为是全局变量,只会被分配一次。
3)为了保存最大的数字(100万位)必须这么大,不存在浪费的问题。
4)一般程序的内存限制 65535 KB,char bigNumber[1000002] 只占 976KB左右,不会超内存限制的。
5)我的程序不止可以计算和 9 取余数的问题,可以计算和【任意数字(int 范围内)】取余数的问题。
6)和 9 取余数的问题,可以等价于和各位数字和取余数的问题,我看了你的归纳证明法时对的。
因此可以对和 9 取余数的问题特别设计。如:
#include
int main(int argc, char *argv[])
{
int T;
char ch;
int remainder;
scanf("%d",&T);
fflush(stdin);
while(T--)
{
remainder = 0;
while((ch=getchar())!='\n')
{
remainder = (remainder + (ch-'0')) % 9;
}
printf("%d\n",remainder);
}
return 0;
}追问全局变量只申请一次,这个确定
虽然可以理论通过(代码看过了,不过没有提交哦),不过,我觉得还是不太好哦
第一,100w的空间首先来说过于庞大,虽按照你的说法能够申请和空间不溢出,但是毕竟现在程序都是寻求最优代码的(小,快,精)
第二,太慢,100w对于这个题目来说不是小数目啊
我们的思路其实一致的,运行时间大概相同
但我的一接受就进行转型和进行预算,最后得结果
不需要占用那么多的资源追答1)100w 字节还不到 1M,对现在的计算机来说不大的。
2)我说过了你的算法是针对特殊数据 9 的,而我的是针对任意数字的。你的程序有专对性,而我的有通用性。
3)你以后会碰到需要开辟这么大空间的题目的,相信我。
- 6楼网友:一秋
- 2021-11-21 06:38
#include
char bigNumber[1000002];
int main(int argc, char *argv[])
{
// 数据总数
int T=0;
// mod 为除数,remainder 为当前的余数
int mod=9,remainder=0;
int i=0;
scanf("%d",&T);
while(T--)
{
scanf("%s",bigNumber);
for(i=0,remainder=0;bigNumber[i];i++)
{
remainder = (remainder*10 + (bigNumber[i]-'0')) % mod;
}
printf("%d\n",remainder);
}
return 0;
}追问嗯,我们的思路大概一样的,不过你的虽然直接
先说一声谢谢了
但是内存利用率不如我的哦,你的数组要占很大一部分空间,而且过大的空间编辑器也无法申请
如果内存超量同样也会出错,而且,最重要的是,输入的数有多有少,有大有小,如果全部都是那么大空间,浪费太严重
ps:你的编辑器通过你的代码?好像你哪个数组申请不来的吧==
char bigNumber[1000002];
int main(int argc, char *argv[])
{
// 数据总数
int T=0;
// mod 为除数,remainder 为当前的余数
int mod=9,remainder=0;
int i=0;
scanf("%d",&T);
while(T--)
{
scanf("%s",bigNumber);
for(i=0,remainder=0;bigNumber[i];i++)
{
remainder = (remainder*10 + (bigNumber[i]-'0')) % mod;
}
printf("%d\n",remainder);
}
return 0;
}追问嗯,我们的思路大概一样的,不过你的虽然直接
先说一声谢谢了
但是内存利用率不如我的哦,你的数组要占很大一部分空间,而且过大的空间编辑器也无法申请
如果内存超量同样也会出错,而且,最重要的是,输入的数有多有少,有大有小,如果全部都是那么大空间,浪费太严重
ps:你的编辑器通过你的代码?好像你哪个数组申请不来的吧==
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯