汉扬编程 编程大纲 求10000以内所有完数之和

求10000以内所有完数之和

  //在vs2005中编译通过,完全数就是它等于它所有的因子之和,
//下面就是根据这个实现的,用的c 实现
//如果需要c代码,请补充下 ,其他代码只会vb的,不太熟悉了
#include
using namespace std;
int main()
{
int i,j;
for(i=2;i {
int sum=0;
for(j=1;j {
if(i%j==0)
sum=sum j;
}
if(i==sum)
{
cout for(j=1;j if(i%j==0)
cout cout }
}
return 0;
}。
  

除以7余3,除以11余4的数有多少?

  推理方法(适合于数比较少的情况)

首先列出除以3余2的数:2,5,8,11,14,17。。。一般只要列出不超过10个数即可。然后在这些数里面找出除以7余3的最小数,即是17。然后从17开始往后列,加3和7的公倍数21:17,38,59,80,101。
  。。然后在这些数里面找出除以11余4的数。即是59。则我们就知道除以3余2,除以7余3,除以11余4的最小数就是59。后面的数就是59依次加上3,7和11的最小公倍数231。所以这些数为59,290,521,752,983。一共有5个。

数学证明(适合于数比较多的方法)

设满足条件的数为m,0≤m≤1000则:

m=3a+2。
  。。。。。(1)

m=7b+3。。。。。。(2)

m=11c+4。。。。。(3)

(1)*77: 77m=231a+154。。。。。(4)

(2)*33: 33m=231b+99 。。。。。(5)

(3)*21: 21m=231c+84 。
  。。。。
  (6)

(4)-(5)-(6)*2: 2m=231(a-b-2c)-113=231k+118,其中:k=a-b-2c-1

∵2m为偶数,∴k为偶数,设k=2n,则:2m=462n+118

—->m=231n+59

∵0≤m≤1000,

∴0≤231n+59≤1000—->0≤231n≤941—->0≤n≤[941/231]=4

所以,在1000以内,符合条件的数有5个

1)设该数为N,即N除以3余2、除以11余4,则(N+7)可同时被3和11整除,

N+7最小为33;

2)33除以7余5,33*2=66,而66除以7余3;

3)所以满足题意的自然数最小为66-7=59.

4)1000以内满足题意的数还有:

59+33*7=290;

59+33*14=521;

59+33*21=752;

59+33*28=983.

故满足题意的数共有5个,分别为59,290,521,752,983.

选A

方法,一般先考虑大数,这里最大数是11,

首先把除以11余4的100以内的数从小到大写出来:

15,26,37,48,59,70,81,92,103。。。。。。。

再逐个检查是否满足另两个条件(写一个检查一个)。

若满足结束这个过程。可以看出59满足,另外再加上

3,7,11的最小公倍数的倍数也一定满足条件,因此

满足条件的数为 59+231k (k是非负整数)

令59+231k

全部

求1000! 帮帮我啊

  int result[] = new int[65500];

int tempres[] = new int[655500];

int i,j,k,m,n,o,q,temp,bit,tempbit;

double s = 1;

tempbit = 0;

for(int l = 2; l 0 || j >= 10) {

j = j / 10;

o = m;

q = 0;

while(q = 10){

temp = temp / 10;

temp = temp + tempres[n];

tempres[n] = temp % 10;

if(n >= tempbit){

tempbit++;

}

n++;

}

if(n >= tempbit){

tempbit = n;

}

q++;

}

m++;

}

bit = tempbit;

for(int p = bit – 1; p >= 0; p–){

int(tempres[p]);

result[p] = tempres[p];

tempres[p] = 0;

}

intln();

}

for(int p = bit – 1; p >= 0; p–){

int(result[p]);

}

因为我手上没有C方面的环境,所以我用java来写的

你只要把 intln();这个输出语句,换成C的就可以

还是说一下程序吧

因为1000!的结果非常大,所以不可能通过普通的方式来存储

也因此只有选用int数组来存储(如果int数组还不行就换long吧)数组的每一个数用来存储每一位数字,这样就可以存储6万多位,应该够大了吧!

然后是算法的问题,有两种方式

一:用加法迭代 即把每一次的乘法转换成加法 比如:10*11 转换成11个10相加(你可以自己试着用这种方法写一下)

二:用乘法 即用被乘数的每一位去乘以乘数 比如:10*11 转换成 1*10 1*10,但是后面这个1*11的结果要前移一位,使它能转换成100

第一种方法实现较为简单,但运行速度可能要慢点

第二种方法实现较为复杂,但运行速度要快点

以下是101!的结果

9。
  425947759838354E159(这是double方式的结果,看样如果是10000!double都无能为力)

942594775983835942085。。。
  (太长了,但可以看到和double运行的结果的前面几位是相同的,所以也应该是正确的)

我花了大概五个小时才搞定(人老人,脑子也不行了)我没有写注释,希望你一个小时内能看懂(锻炼一下你自己)

另外,我那么辛苦应该再加点分吧(强烈要求^_^)

祝你好运。

  #include

#include

#include

#include

#define N 1000 //多少位的阶乘

using namespace std;

long fun(long *a)

{

long i, j, c, t, m;

m=1;

for(i=1; i=0; i–)

{

cout。
  width(3);

cout。fill(\’0\’);

cout=0; i–)

{

if(0==i%20) out  fill(\’0\’);

out  

#include

void main()

{

long int fac(int n);

long int y;

int n;

scanf(\”%d\”,&n);

y=fac(n);

printf(\”%ld\”,y);

}

long int fac(int n);

{

long int y;

if (n

全部

本文来自网络,不代表汉扬编程立场,转载请注明出处:http://www.hyzlch.com/mianfei/6239.html

二进制转十六进制_二进制如何转十六进制

众议生风丨5C模型出炉:全球核心素养教育的“中国方案”

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

返回顶部