一道取模运算习题

logiciel 2009-06-20 08:04:11
请给出以下函数modulo的体,代码要尽可能简短。
用字符串表达的num的值域超出int。

#include <stdio.h>
#include <assert.h>

int modulo(char *num, int mod)
{
}

int main(void)
{
assert(modulo("2",1) == 0);
assert(modulo("1234567890",99) == 72);
assert(modulo("1234567899",123456789) == 9);
assert(modulo("123456789",9) == 0);
return 0;
}
...全文
200 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
logiciel 2009-06-21
  • 打赏
  • 举报
回复
感谢各位的参与。本题及以下参考答案来自国外资料。

#include <stdio.h>
#include <assert.h>

int modulo(char * num, int mod)
{
int res = 0;
while ( *num )
{
res = (res*10 + (*num - '0') )%mod;
num++;
}
return res;
}

int main(void)
{
assert(!(modulo("2",1) == 1));
assert(modulo("2",1) == 0);
assert(modulo("0",9) == 0);
assert(modulo("1234567890",99) == 72);
assert(modulo("543210",133) == 38);
assert(modulo("1234567899",123456789) == 9);
assert(modulo("123456789",9) == 0);
puts("P A S S E D !");
return 0;
}
tkminigame 2009-06-21
  • 打赏
  • 举报
回复
改下就能通过了
int modulo(char *num, int mod)
{
char *p=num; __int64 j=0,k=0;
assert(mod>=0);
for(; *p!='\0'; p++){
k = k*10+(*p - 0x30);//取一位,
j = k/mod;//第一次计算的商.
k -= mod*j;//算出余数
}
return (int)k;//最后的余数.
}



int main(void)
{
assert(modulo("2",1) == 0);
assert(modulo("1234567890",99) == 72);
assert(modulo("1234567899",123456789) == 9);
assert(modulo("123456789",9) == 0);
assert(modulo("2147483649",2147483647) == 2);//加个极端的例子
return 0;
}
tkminigame 2009-06-21
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 ljljlj 的回复:]
#include <stdio.h>
#include <assert.h>
//本函数忽略mod为负的情况.
//我在用笔在纸上算了一个数,然后用C语言把这个过程描述下来了.
int modulo(char *num, int mod)
{
char *p=num; int j=0,k=0;
assert(mod>=0);
for(p=num; *p!='\0; p++){
k = k*10+(*p - 0x30);//取一位,
j = k/mod;//第一次计算的商.
k -= mod*j;//算出余数
}
return k;//最后的余数.
}

int main(void)
{
//asse…
[/Quote]

如果遇到大点的mod就可能溢出。
tkminigame 2009-06-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 logiciel 的回复:]
对不起,要求没有说清楚,用字符串表达的num的值是任意大小的数,可能超过__int64的值域,例如,num="13131313131313131313131313", mod是int型,例如,mod=13.
[/Quote]
那你也整个大数的断言出来啊,误导人。。
ljhhh0123 2009-06-20
  • 打赏
  • 举报
回复
csdn怎么搞的,跳格键哪里去了?
好好的版式,全乱了.
ljhhh0123 2009-06-20
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <assert.h>
//本函数忽略mod为负的情况.
//我在用笔在纸上算了一个数,然后用C语言把这个过程描述下来了.
int modulo(char *num, int mod)
{
char *p=num; int j=0,k=0;
assert(mod>=0);
for(p=num; *p!='\0; p++){
k = k*10+(*p - 0x30);//取一位,
j = k/mod;//第一次计算的商.
k -= mod*j;//算出余数
}
return k;//最后的余数.
}

int main(void)
{
//assert(modulo("2",1) == 0);
//assert(modulo("1234567890",99) == 72);
//assert(modulo("1234567899",123456789) == 9);
//assert(modulo("123456789",9) == 0);
//楼主这样的写法不利于调试,所以我给改成下面的方法了.

printf("1234567890 mod 99 == %d\n", modulo("1234567890",99));
printf("12345670 mod 79 == %d\n", modulo("12345670",79));
printf("123890 mod 97 == %d\n", modulo("123890",97));
printf("10 mod 99 == %d\n", modulo("10",99));
printf("0 mod 9 == %d\n", modulo("0",9));
printf("1890 mod 20 == %d\n", modulo("1890",20));
printf("1567890 mod 1 == %d\n", modulo("1567890",1));

return 0;
}
yejinson 2009-06-20
  • 打赏
  • 举报
回复
1楼的很fuck了
sui_yuan_zhe 2009-06-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hikaliv 的回复:]
C/C++ code
__int64 Fuck_your_modulo ( char* cFuck, int modFuck )
{
char* fuck = cFuck;
__int64 iFuck = 0;

while ( *fuck != '\0' )
{
iFuck = iFuck * 10 + *fuck - 0x30;
fuck++;
}

return iFuck % modFuck;
}
[/Quote]

还fuck
你太有才了····
guocai_yao 2009-06-20
  • 打赏
  • 举报
回复
好吧 学习下
magipan 2009-06-20
  • 打赏
  • 举报
回复
试试,模拟的除法
int modulo(char *num, int mod)
{
int i, n=0;
for(i=0; num[i]!=0; i++)
{
n = n*10+num[i]-'0';//从头开始取数
if(n >= mod)
{
n %= mod;//取到比mod大的时候把mod的倍数部分去掉
}
}
return n%mod;
}
logiciel 2009-06-20
  • 打赏
  • 举报
回复
对不起,要求没有说清楚,用字符串表达的num的值是任意大小的数,可能超过__int64的值域,例如,num="13131313131313131313131313", mod是int型,例如,mod=13.

tkminigame 2009-06-20
  • 打赏
  • 举报
回复
int modulo(char *num, int mod)
{
int i = 0;
while('\0'!=*num) i =i*10+ *num++-'0';
return i%mod;
}
只用3行
acdbxzyw 2009-06-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hikaliv 的回复:]
C/C++ code
__int64 Fuck_your_modulo ( char* cFuck, int modFuck )
{
char* fuck = cFuck;
__int64 iFuck = 0;

while ( *fuck != '\0' )
{
iFuck = iFuck * 10 + *fuck - 0x30;
fuck++;
}

return iFuck % modFuck;
}
[/Quote]
fUck the fUcking fUnction which is fUckingly good.
光宇广贞 2009-06-20
  • 打赏
  • 举报
回复

__int64 Fuck_your_modulo ( char* cFuck, int modFuck )
{
char* fuck = cFuck;
__int64 iFuck = 0;

while ( *fuck != '\0' )
{
iFuck = iFuck * 10 + *fuck - 0x30;
fuck++;
}

return iFuck % modFuck;
}

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧