求助大佬,万分感谢
输入一组数,以0作为结束标志,对除0之外的数进行初级,求各自的真约数之和,样例
输入:
220
284
0
输出:
284
220
用c语言编程最好 排序吧 #include <stdio.h>
int main(void)
{
int i = 0, num = 0;
int arr = {0};
printf("输入:\n");
while(1)
{
scanf("%d",&num);
if (num != 0) {
arr = num;
}
else
break;
}
int sum = 0;
int len = i;
printf("输出:\n");
while(i)
{
for(int j=1; j<arr; j++)
{
if(arr%j == 0)
{
sum += j;
}
}
printf("%d\n", sum);
i--;
sum = 0;
}
return 0;
}
本帖最后由 sunrise085 于 2019-3-20 17:05 编辑
ba21 发表于 2019-3-20 15:44
排序吧
大佬~~认真审题~人家是要真约数之和,不是排序啊 #include <stdio.h>
#include <math.h>
int main(void) {
int mysum(int a);
int i=0,flag=1,num,sum;
while(flag&&i<10){
scanf("%d",&num);
if(num>0){
sum=mysum(num);
i++;
}
else
flag=0;
}
for(int j=0;j<i;j++){
printf("%d\n",sum);
}
return 0;
}
int mysum(int a){
int sum=1;
float t;
t=sqrt(a);
for(int i=2;i<t;i++){
if(a%i==0){
sum=sum+i+a/i;
}
}
return sum;
} 本帖最后由 Croper 于 2019-3-20 18:30 编辑
这是比较接近正常数学方法的求法,速度比一个一个试真因数要快,特别是在数据较大的情况下,但是代码就相对比较复杂了
思路就是分解质因数,并根据质因数求出所有真因数,再将他们相加
应该可以写成c语言的格式,但是没有标准库真的很难受- -
#include <iostream>
#include <map>
#include <vector>
#include <math.h>
using namespace std;
bool IsPrime(int num);
int prime(int n);
bool IsPrime(int num) { //num是否是质数
for (int i = 0; prime(i) <= sqrt(num); ++i) { //如果num不能整除所有比sqrt(num)小的质数,那么num一定是质数;
if (num % prime(i) == 0) return false;
}
return true;
}
int prime(int n) { //获取第n个质数
static vector<int> vec = { 2 }; //存储所有质数的vector
while (n >= vec.size()) { //当需要获取的质数大于vector的size时,扩展vector;
int next = vec.back();
while (!IsPrime(++next));
vec.push_back(next);
}
return vec;
}
map<int,int> RslvToPrmFctrs(int num) {//分解质因数
if (num == 0 || num==1) return map<int,int>(); //如果要分解0,直接返回空值
map<int, int> ret; //使用map存储分解结果,map<质因数值,质因数数量>
int i = 0;
while (prime(i)<=sqrt(num)) {
if (num % prime(i) == 0) { //从小的质数开始分解,直到原数为质数为止
ret++;
num /= prime(i);
}
else {
++i;
}
}
ret++;
return ret;
}
int GetSumByPrmFctrs(map<int,int> PrmFctrs) {//根据质因数求所有真因数之和
int n = 1;
int sum = 0;
for (auto p : PrmFctrs) { //若一个数有num1个质因数a1,num2个质因数a2..num个质因数a,因为任意数量的值因数相乘总能得到一个因数,
n *= p.second+1;
}
n--; //总的因数数量为N=(num1+1)(num2+1)..(num+1),真因数数量为N-1;
for (int i = 0; i < n; ++i) {
int product = 1; //求每个真因数
int a = i;
for (auto p : PrmFctrs) {
product *= pow(p.first, a % (p.second+1));
a /= (p.second+1);
}
sum += product;
}
return sum;
}
int GetFriendNum(int num) {
map<int, int> tmp = RslvToPrmFctrs(num); //分解质因数
return GetSumByPrmFctrs(tmp); //根据质因数求所有真因数之和
}
int main() {
vector<int> ans;
do {
int a;
cin >> a;
if (a == 0) break;
ans.push_back(GetFriendNum(a));
} while (true);
cout << endl;
for (int i : ans) {
cout << i << endl;
}
system("pause");
}
多谢大佬们 sunrise085 发表于 2019-3-20 16:36
大佬~~认真审题~人家是要真约数之和,不是排序啊
我问他是不是排序!~你答你的题就好。来回复我不觉得浪费你宝贵时间?
页:
[1]