24小时热门版块排行榜    

查看: 1415  |  回复: 12

freedomice

金虫 (正式写手)

[求助] 求组一个c程序问题

题目:由n个1组成的整数能被2011整除,求n至少为多大?
代码如下。经调试当运行到9个1的时候,数据变成负的,疑为溢出,但不知道到底是哪里出问题了?
#include
#define N 2011
void main()
{
        long a=1,n=0;

        while(a%N)
        {
                a=10*a+1;
                n++;
        }
        printf("%ld",a);

}
回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
回帖支持 ( 显示支持度最高的前 50 名 )

sudo

木虫 (正式写手)

引用回帖:
10楼: Originally posted by lurencyj at 2012-04-20 22:32:07:
不明白了。。。。
求讲解。。。。。

a ≡ b (mod n)
意思是a模n的值等于b模n的值

a ≡ a (mod n)
这个理所当然啦

a ≡ a mod n (mod n)
这个,因为a模n的值小于n,所以计算“a模n,再继续模n”的话,结果是不变的,还是等同于a模n

接下来呢。。。证明一下,如果a ≡ b (mod n)那么ac ≡ bc (mod n)
CODE:
假设一个余数叫r,那么因为a ≡ b (mod n),我们可以将a和b写成
a = k1 * n + r
b = k2 * n + r  【注意这里的r 然后就有
ac = c * k1 * n + r * c
bc = c * k2 * n + r * c
于是得到:
ac 模 n = r * c 模 n
bc 模 n = r * c 模 n
即为
ac ≡ bc (mod n)

最后一个,就是证明:如果a ≡ b (mod n)那么a+c ≡ b+c (mod n)
这个和上面的方法差不多,就省略了

最后得到的关系式:10a+1 ≡ 10(a mod n)+1 (mod n)
这意味着什么呢?我不断地迭代a的值到10a+1,每次作求模测试,其实我只需要迭代a%n就行了,这样也保证不会溢出

于是就得到了上面所述的程序
11楼2012-04-20 23:31:40
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
普通回帖

lurencyj

木虫 (著名写手)

【答案】应助回帖


感谢参与,应助指数 +1
xzhdty: 金币+1, 欢迎常来程序语言看看 2012-04-20 23:14:49
确实是溢出问题。
我的C++代码:
CODE:
#include
#include

using namespace std;

int main(int argc, char *argv[])
{
                long a = 1, n = 1;

                while(a%2011)
                {
                                cout << "n = " << n
                                                << ", a = " << a
                                                << endl;

                                if(n == 20)
                                                break;

                                n++;
                                a = 10*a+1;
                }
                cout << "a = " << a << endl;
                cout << "size of long = " << sizeof(long) << endl;
                cout << "maxmum of long = " << numeric_limits::max() << endl;
                return 0;
}

运行结果:
CODE:
n = 1, a = 1
n = 2, a = 11
n = 3, a = 111
n = 4, a = 1111
n = 5, a = 11111
n = 6, a = 111111
n = 7, a = 1111111
n = 8, a = 11111111
n = 9, a = 111111111
n = 10, a = 1111111111
n = 11, a = 11111111111
n = 12, a = 111111111111
n = 13, a = 1111111111111
n = 14, a = 11111111111111
n = 15, a = 111111111111111
n = 16, a = 1111111111111111
n = 17, a = 11111111111111111
n = 18, a = 111111111111111111
n = 19, a = 1111111111111111111
n = 20, a = -7335632962598440505
a = -7335632962598440505
size of long = 8
maxmum of long = 9223372036854775807

» 本帖已获得的红花(最新10朵)

很女子很弓虽大
2楼2012-04-20 16:06:14
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

freedomice

金虫 (正式写手)

送鲜花一朵
引用回帖:
2楼: Originally posted by lurencyj at 2012-04-20 16:06:14:
确实是溢出问题。
我的C++代码:

#include <iostream>
#include <limits>

using namespace std;

int main(int argc, char *argv[])
{
                long a = 1, n = 1;

                while(a%2011)
                {
         ...

非常感谢
我还是不明白问题在哪里
为什么我的到9位就溢出了
3楼2012-04-20 16:18:25
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

lurencyj

木虫 (著名写手)

【答案】应助回帖

★ ★ ★ ★ ★
freedomice: 金币+5, ★★★很有帮助 2012-04-20 17:15:33
平台的问题,估计你用的是TC平台,long的位数大概只有4位。因此,最大的正整数是4亿多一点(2的32次,减1),具体看C语言教科书里面的int和long的取值范围。

我上面给的程序里面已经输出了我这边运算平台long的位数是8位。

[ 发自手机版 http://muchong.com/3g ]
很女子很弓虽大
4楼2012-04-20 16:27:22
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

lurencyj

木虫 (著名写手)

【答案】应助回帖

补充一下:
8位的long,最大数值为1.8447E19
4位的long,最大数值为4.295E9

[ 发自手机版 http://muchong.com/3g ]

» 本帖已获得的红花(最新10朵)

很女子很弓虽大
5楼2012-04-20 16:33:22
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

freedomice

金虫 (正式写手)

送鲜花一朵
引用回帖:
5楼: Originally posted by lurencyj at 2012-04-20 16:33:22:
补充一下:
8位的long,最大数值为1.8447E19
4位的long,最大数值为4.295E9

谢谢
差不多知道原因了
用的是vc6
我用excel算过一下
9位的时候数字远小于2^64-1
可能正好是2^32-1的界点
6楼2012-04-20 17:15:14
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

lurencyj

木虫 (著名写手)

不是的,你的计算9次,此时是计算了10次,你落掉了一次。

a溢出的前一次他的数值是9个1,后来被尝试赋值成10个1时候,就乱了。
很女子很弓虽大
7楼2012-04-20 17:21:24
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

sudo

木虫 (正式写手)


xzhdty: 金币+1, 谢谢参与 2012-04-20 23:15:14
这个问题可以数学味一点

同余方程式
CODE:
  a ≡ a (mod n)
=> a ≡ a mod n (mod n)
=> 10a ≡ 10(a mod n) (mod n)
=> 10a+1 ≡ 10(a mod n)+1 (mod n)

那么程序就是这样了
CODE:
#include

int main() {
        int a = 1, n = 1;
       
        while(a %= 2011){
                a = 10*a + 1;
                n++;
        }
       
        printf("n=%d\n", n);
        return 0;
}

8楼2012-04-20 22:22:36
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

sudo

木虫 (正式写手)

算得n=670,有点出乎意料
9楼2012-04-20 22:24:01
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

lurencyj

木虫 (著名写手)

引用回帖:
8楼: Originally posted by sudo at 2012-04-20 22:22:36:
这个问题可以数学味一点

同余方程式

  a ≡ a (mod n)
=> a ≡ a mod n (mod n)
=> 10a ≡ 10(a mod n) (mod n)
=> 10a+1 ≡ 10(a mod n)+1 (mod n)


那么程序就是这样了

#include < ...

不明白了。。。。
求讲解。。。。。
很女子很弓虽大
10楼2012-04-20 22:32:07
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 freedomice 的主题更新
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[找工作] 售SCI文章,我:8O5.5.1.O.54,科目齐全,可+急 +4 k0dTPqJtl0jt 2026-08-14 4/200 2026-08-15 02:21 by 4wMiSEwB6436
[基金申请] 小木虫上这么多卖论文的,真有人买论文么?感觉没必要啊 +11 Tide man 2026-08-10 12/600 2026-08-15 02:12 by home3163
[考研] 售SCI文章,我:8O5.5.1.O.54,科目齐全,可+急 +3 7lpolszZVXgi 2026-08-14 5/250 2026-08-15 00:52 by 4wMiSEwB6436
[考研] 售SCI一区T0P文章,我:8.O55.1.O.54,科目全,可十急 +3 HFw0lei2R37i 2026-08-14 7/350 2026-08-15 00:40 by 4wMiSEwB6436
[基金申请] 咱们一起用铁证分析2026国家社科基金中标与否 +7 启萌科技 2026-08-12 22/1100 2026-08-14 23:45 by Noways
[基金申请] 是这周出结果还是下周出结果? +4 yuleib84 2026-08-11 4/200 2026-08-14 23:05 by lfy8008
[教师之家] 售SCI一区文章,我:8.O.55.1.O.54,科目齐全,可伽急 +3 HFw0lei2R37i 2026-08-14 5/250 2026-08-14 22:32 by 4wMiSEwB6436
[基金申请] 欢迎发来filecode的Mz6后的代码验证其规律 +23 医学老男孩 2026-08-13 49/2450 2026-08-14 20:02 by zhaifei
[基金申请] 哪位老哥知道今年的国自然具体哪一天放榜? +5 Ldrop2023 2026-08-13 5/250 2026-08-14 18:48 by ssxclkj
[基金申请] filecode +6 cratir 2026-08-14 10/500 2026-08-14 18:29 by 笑叹辞穷
[基金申请] 奇怪,两个人的filecode固定段从头到尾一模一样 +8 布布和一二 2026-08-10 11/550 2026-08-14 14:58 by Equinoxhua
[基金申请] filecode +15 documentary 2026-08-10 17/850 2026-08-14 10:08 by kissu88
[基金申请] FileCode能看出啥? +10 要乐观耀哥 2026-08-10 32/1600 2026-08-14 09:37 by 要乐观耀哥
[文学芳草园] 阿姨 +4 汪汪锅 2026-08-09 4/200 2026-08-13 19:43 by arzu_hma
[硕博家园] 一作与独作在应聘高校教师时区别大吗 +3 mbygzh 2026-08-08 4/200 2026-08-13 19:31 by 龙-樱
[基金申请] 重要来源:本周末出结果 +10 瞬息宇宙 2026-08-12 10/500 2026-08-13 15:46 by likettle
[基金申请] 结合人工智能,周易传统文化,filecode打分制来了,3分以上希望很大。 +3 Tide man 2026-08-12 4/200 2026-08-13 08:35 by ZJTJZ
[基金申请] 综述论文作为代表作会不会影响评审专家的印象分? +11 yufeiwaner 2026-08-09 13/650 2026-08-12 08:17 by yufeiwaner
[基金申请] 据悉今年马上要出结果了 +7 瞬息宇宙 2026-08-10 8/400 2026-08-10 12:42 by Vivilian
[基金申请] 2026国自然放榜时间 +9 布布和一二 2026-08-08 9/450 2026-08-10 11:22 by xxxx2020
信息提示
请填处理意见