奇怪數為這樣一個整數,①:除了自身以外所有因子之和大于這個數本身(首先必須是盈數);②:除了自身以外所有因子的集合,沒有任何一個子集中所有數的和等于這個數本身,例如70就是一個奇怪數,求1000以內的第二個奇怪數,找出來是72,答案不對,希望給位前輩能幫我看看哪里出了問題
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
void back(int i,int n,int m,int a[]);
int comp(int u,int v);
int i,j,n,k,sum,flag=1,t,a[1000],num;
int main()
{
for(n=71;n<=1000;n++)
{
int i=0,sum=0,num=0;
for(j=2;j<=n-1;j++) //找 n的所有因子
{
if(n%j==0)
{
a[i]=j; //將n的因子存在陣列a[1000]中
sum=sum+j;// 計算所有因子的和
i++; //陣列的序號+1
num++; //計算陣列的大小,n的所有因子數
}
}
sum=sum+1; //1也是n的因子
a[num]=1; //把1賦給陣列a[1000]
if(sum>n) //判斷n是否為贏數
{
t=num+1; //把n的因子數賦給t
int b[t]={0}; //初始化陣列b,給定陣列a中的元素一個狀態,類似排列組合
back(1,t,sum,a);//從第1個元素開始 ,求n所有因子的子集的和并與sum比較
if(flag) //判斷sum是否n的任意子集元素的和相等
{
printf("%d是奇怪數\n",n);
break;//找到第一個奇怪數后停止回圈
}
}
}
return 0;
}
void back(int i,int n,int m,int a[1000])
{
int b[t];
int k,Sum=0;
if(i>n)//判斷a中的元素的狀態是否都已確定
{
for(k=1;k<=n;k++)// 對a中的元素 進行排列組合
{
if(b[k]) //判斷第K個元素的狀態
Sum+=a[k];
}
comp(Sum,m);
return;//如果滿足這個條件,就不用執行后面為a中的元素賦予一種狀態的操作。
}
{
b[i]=1; //對a中元素的狀態進行排列組合
back(i+1,t,sum,a);
b[i]=0;
back(i+1,t,sum,a);
}
return;
}
int comp(int u,int v)//比較sum和Sum是否相等的函式
{
if(u==v)
flag=0;
return flag;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/130291.html
標籤:疑難問題
上一篇:哪位大神知道怎么寫代碼
