例5    分解质因数

题目描述

将一个正整数分解质因数。例如:输入90,输出 90=2*3*3*5。

输入

输入数据包含多行,每行是一个正整数n (1<n <100000) 。

输出

对于每个整数n将其分解质因数。

输入样例

90

256

199

输出样例

90=2*3*3*5

256=2*2*2*2*2*2*2*2

199=199

(1)编程思路。

对整数n进行分解质因数,应让变量i等于最小的质数2,然后按下述步骤完成:

1)如果i恰等于n,则说明分解质因数的过程已经结束,输出即可。

2)如果n<>i,但n能被i整除,则应输出i的值,并用n除以i的商,作为新的正整数n,转第1)步。

3)如果n不能被i整除,则用i+1作为新的i值,转第1)步。

因此,程序主体是一个循环,在循环中根据n能否整除i,进行两种不同处理,描述为:

i=2;

while(i<n)

{

if(n%i==0)

{

printf("%d*",i)     // i是n的因数,输出i

n=n/i;            // 对除以因数后的商在进行分解

}

else

i++;             // 找下一个因数

}

(2)源程序。

#include <stdio.h>

int main()

{

int n,i;

while (scanf("%d",&n)!=EOF)

{

printf("%d=",n);

i=2;

while(i<n)

{

if(n%i==0)

{

printf("%d*",i);

n=n/i;

}

else

i++;

}

printf("%d\n",n);

}

return 0;

}

习题5

5-1  完全数

题目描述

完全数(Perfect number)又称完美数或完备数,是一些特殊的自然数。它所有的真因子(即除了自身以外的约数)的和,恰好等于它本身。

例如:第一个完全数是6,它有约数1、2、3、6,除去它本身6外,其余3个数相加,1+2+3=6。第二个完全数是28,它有约数1、2、4、7、14、28,除去它本身28外,其余5个数相加,1+2+4+7+14=28。

编写一个程序,求两个正整数之间完全数的个数。

输入

输入数据包含多行,第一行是一个正整数n,表示测试实例的个数,然后就是n个测试实例,每个实例占一行,由两个正整数num1和num2组成,(1<num1,num2<10000) 。

输出

对于每组测试数据,请输出num1和num2之间(包括num1和num2)存在的完全数个数。

输入样例

2

2 5

5 7

输出样例

0

1

(1)编程思路。

要求num1和num2之间的所有完全数,需要对num1~num2范围内的每一个数n,计算n的所有真因子之和s,若n==s,则n就是一个完全数。框架描述为:

for(n=num1;n<=num2;n++)

{

计算n的真因子之和s ;

if(s==n)

是完全数,计数;

}

为计算n的所有真因子之和s,可令s初值为1(1是n的真因子),然后用2~n-1范围内的每个i去除n,如果n能被i整除(即n%i==0),则i是n的真因子,s=s+i。

实际上,i(i>1)是n的真因子,则n/i也是n的真因子。因此,可以将i的范围缩小为2~sqrt(n)。这样,计算n的真因子之和s的操作描述为:

s=1;                                                // s为n的真因子之和

for(i=2;i<=sqrt(n);i++)                // 求解真因子之和

if(n%i==0)

if (i!=n/i)  s=s+i+n/i;

else  s=s+i;

因此,程序可以写成一个嵌套的二重循环。

(2)源程序。

#include <stdio.h>

#include <math.h>

int main()

{

int t,num1,num2,i,n,s,cnt;

scanf("%d",&t);

while (t--)

{

scanf("%d%d",&num1,&num2);

cnt=0;

if (num1>num2) { n=num1; num1=num2; num2=n;}

for(n=num1;n<=num2;n++)

{

s=1;                                                // s为n的真因子之和

for(i=2;i<=sqrt(n);i++)                // 求解真因子之和

if(n%i==0)

{

if (i!=n/i)  s=s+i+n/i;

else  s=s+i;

}

if(s==n)  cnt++;

}

printf("%d\n",cnt);

}

return 0;

}

5-2  亲和数

题目描述

遥远的古代,人们发现某些自然数之间有特殊的关系:如果两个数a和b(a不等于b),a的所有真因数之和等于b,b的所有真因数之和等于a,则称a、b是一对亲和数。

例如220和284,1184和1210,2620和2924,5020和5564,6232和6368。

给定一个正整数 S(6≤S≤18000) ,找出a,b两数中至少有一个不小于S的第一对“亲和数” 。

输入格式

一行一个整数S。

输出格式

一行两个整数A 和 B(用空格隔开)。A 表示第一个不小于 S 的有“亲和数”的整数,B是A的“亲和数”。

输入样例 #1

206

输出样例 #1

220  284

输入样例 #2

260

输出样例 #2

284  220

(1)编程思路。

程序对输入整数begin开始的自然数进行穷举,算法描述为:

for(n=begin;;n++)

{

计算n的真因子之和 s ;

if (s==n) continue;

计算s的真因子之和 m ;

if(m==n)                        // 如果两数相等,是解

{

输出解的情况;

}

}

计算自然数的真因子之和的方法,可以参见前面的习题5-1“完全数”。

(2)源程序。

#include <stdio.h>

#include <math.h>

int main()

{

int begin,i,n,s,m,k;

scanf("%d",&begin);

for(n=begin;;n++)

{

s=1;                                                   // s为n的真因子之和

k=1;                                                  // k为n的真因子个数

for(i=2;i<=(int)sqrt(1.0*n);i++)          // 求解真因子之和

if(n%i==0)

{

s=s+i+n/i;

k+=2;

}

i--;

if (i*i==n) s-=i;

if(k==1 || s==n)                                    // 若n为质数或完数,进行下次循环

continue;

m=1;                                                   // m为s的真因子之和

for(i=2;i<=(int)sqrt(1.0*s);i++)

if(s%i==0)

m+=i+s/i;                       // 计算s的真因子之和

i--;

if (i*i==s)  m-=i;

if(m==n)                                      // 如果两数相等,输出亲和数

{

printf("%d %d\n",n,s);

break;

}

}

return 0;

}

5-3  The number of divisors about Humble Numbers

Problem Description

A number whose only prime factors are 2,3,5 or 7 is called a humble number. The sequence 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, 25, 27, ... shows the first 20 humble numbers.

Now given a humble number, please write a program to calculate the number of divisors about this humble number.For examle, 4 is a humble,and it have 3 divisors(1,2,4);12 have 6 divisors.

Input

The input consists of multiple test cases. Each test case consists of one humble number n,and n is in the range of 64-bits signed integer. Input is terminated by a value of zero for n.

Output

For each test case, output its divisor number, one line per case.

Sample Input

4

12

0

Sample Output

3

6

(1)编程思路。

若一个大于1正整数n可以分解质因数:n=(p1^a1)*(p2^a2)*(p3^a3)*…*(pk^ak),

则由约数个数定理可知n的正约数有 (a1+1)(a2+1)(a3+1)…(ak+1)个。

本题要求一个给定丑数n的约数个数,而一个丑数分解质因数后,其质因子只有2、3、5或7这4个,因此只需求出n中分别含有质因子2、3、5和7的个数即可。

(2)源程序。

#include <stdio.h>

int fun(__int64 n,int x)    // 求整数n分解质因数后含质因子x的个数

{        int sum=0;

while(n%x==0)

{

sum++;

n/=x;

}

return sum;

}

int main()

{

int cnt1,cnt2,cnt3,cnt4;

__int64 n;

while(scanf("%I64d",&n) && n!=0)

{

cnt1=cnt2=cnt3=cnt4=1;

cnt1+=fun(n,2);

cnt2+=fun(n,3);

cnt3+=fun(n,5);

cnt4+=fun(n,7);

printf("%d\n",cnt1*cnt2*cnt3*cnt4);

}

return 0;

}

C语言程序设计100例之(5):分解质因数的更多相关文章

  1. 黑马程序员——经典C语言程序设计100例

    1.数字排列 2.奖金分配问题 3.已知条件求解整数 4.输入日期判断第几天 5.输入整数进行排序 6.用*号显示字母C的图案 7.显示特殊图案 8.打印九九口诀 9.输出国际象棋棋盘 10.打印楼梯 ...

  2. C语言程序设计100例之(4):水仙花数

    例4    水仙花数 题目描述 一个三位整数(100-999),若各位数的立方和等于该数自身,则称其为“水仙花数”(如:153=13+53+33),找出所有的这种数. 输入格式 没有输入 输出格式 若 ...

  3. C语言程序设计100例之(11):求质数

    例11  求质数 问题描述 质数是指除了有1和自身作为约数外,不再有其他约数的数.比如:3.5.7是质数.而9不是质数,因为它还有约数3. 编写程序求给定区间中的所有质数. 输入格式 两个整数a和b, ...

  4. C语言程序设计100例之(22):插入排序

    例22  插入排序 问题描述 排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素或记录的任意序列,重新排列成一个以关键字递增(或递减)排列的有序序列. 排序的方法有很多,简单插入排序就是一 ...

  5. C语言程序设计100例之(18):火柴棒等式

    例18   火柴棒等式 用n根火柴棍,可以拼出多少个形如“A+B=C”的等式?等式中的A.B.C是用火柴棒拼出的整数(若该数非零,则最高位不能是0).用火柴棒拼数字0~9的拼法如图1所示. 图1  用 ...

  6. C语言程序设计100例之(16):巧解算式

    例16  巧解算式 问题描述 在1.2.3.4.5.6.7.8.9.10个数中间加上加号或减号,使得到的表达式的值为自然数N,如果中间没有符号,则认为前后为一个数,如1 2 3认为是一百二十三(123 ...

  7. C语言程序设计100例之(9):生理周期

    例9    生理周期 问题描述 人生来就有三个生理周期,分别为体力.感情和智力周期,它们的周期长度为 23 天.28 天和33 天.每一个周期中有一天是高峰.在高峰这天,人会在相应的方面表现出色.例如 ...

  8. C语言程序设计100例之(6):数字反转

    例6    数字反转 题目描述 给定一个整数,请将该数各个位上数字反转得到一个新数.新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零(参见样例2). 输入格式 ...

  9. C语言程序设计100例之(8):尼科彻斯定理

    例8    尼科彻斯定理 题目描述 尼科彻斯定理可以叙述为:任何一个整数的立方都可以表示成一串连续的奇数的和.需要注意的是,这些奇数一定是连续的,如:1,3,5,7,9,…. 例如,对于整数5,5*5 ...

随机推荐

  1. Oracle DB Time

    Oracle DB Time是Oracle数据库在时间维度上剖析性能的一个重要指标,通过逐级分解该指标,定位到浪费资源或者资源争用的首要事件上,从而通过减少等待以及最小化每个请求的使用资源来达到优化的 ...

  2. grep的使用及正则表达式

    1.常用选项: -E :开启扩展(Extend)的正则表达式. -i :忽略大小写(ignore case). -v :反过来(invert),只打印没有匹配的,而匹配的反而不打印. -n :显示行号 ...

  3. 使用可移动表空间(TTS)的最佳做法 (Doc ID 1457876.1)

    Best Practices for Using Transportable Tablespaces (TTS) (Doc ID 1457876.1) APPLIES TO: Oracle Datab ...

  4. 一步一步创建聊天程序2-利用epoll来创建简单的聊天室

    如图,这个是看视频时,最后的作业,除了客户端未使用select实现外,其它的要求都有简单实现. 服务端代码如下: #include <stdio.h> #include <strin ...

  5. Python实现单链表数据的添加、删除、插入操作

    Python实现单链表数据的添加.删除.插入操作 链表的定义: 链表(linked list)是由一组被称为结点的数据元素组成的数据结构,每个结点都包含结点本身的信息和指向下一个结点的地址.由于每个结 ...

  6. 第04组 Beta版本演示

    小组信息 组名:斗地组 组长博客:地址 组内成员: 组员 学号 林涛(组长) 031702616 童圣滔 031702117 林红莲 031702213 潘雨佳 031702214 覃鸿浩 03170 ...

  7. ReactNative: 使用输入框TextInput组件

    一.简介 一个应用程序中,输入框基本不可或缺,它衍生的搜索功能在很多APP中随处可见.在iOS开发中,使用的输入框组件是UITextView和UITextField,在React-Native中使用的 ...

  8. 蓝牙spp协议分析

    基本概念 蓝牙串口是基于 SPP 协议(Serial Port Profile),能在蓝牙设备之间创建串口进行数据传输的一种设备. 蓝牙串口的目的是针对如何在两个不同设备(通信的两端)上的应用之间保证 ...

  9. 【algo&ds】4.B树、字典树、红黑树、跳表

    上一节内容[algo&ds]4.树和二叉树.完全二叉树.满二叉树.二叉查找树.平衡二叉树.堆.哈夫曼树.散列表 7.B树 B树的应用可以参考另外一篇文章 8.字典树Trie Trie 树,也叫 ...

  10. win10禁止自动更新的终极方法(亲测有效)

    想必用过win10的朋友对其自动更新一定不会陌生,并且深恶痛绝,    有时正专注做一件事,突然就开始自动更新,被杀个措手不及,而且更新时间真的太久了,尤其最近更新频繁,真是伤脑筋,    期间也尝试 ...