算法竞赛入门经典-第五章因子和阶乘
2016-11-29 18:08
363 查看
#include<stdio.h>
#include<string.h>
int is_prime(int n) {
for(int i = 2; i*i <= n; i++)
if(n % i == 0) return 0;
return 1;
}
int prime[100], count = 0;
int main() {
int n, p[100];
for(int i = 2; i <= 100; i++)
if(is_prime(i)) prime[count++] = i;
while(scanf("%d", &n) == 1) {
printf("%d! =", n);
memset(p, 0, sizeof(p));
int maxp = 0;
for(int i = 1; i <= n; i++) {
int m = i;
for(int j = 0; j < count; j++)
while(m % prime[j] == 0) {//拆分成素数形势start
//while判断:如果该素数使m的一个因子
m /= prime[j];//那么更新m成为乘式中非素数的因子
p[j]++;//j的幂次加1
if(j > maxp) maxp = j;//拆分成素数形式end
}
}
for(int i = 0; i <= maxp; i++)
printf(" %d", p[i]);
printf("\n");
}
return 0;
}
//分析思路
//1.将n!=1*2*3...*n每一个乘积项进行素数乘积的检验,看每一项能如何用素数因子表示
//2.将素数因子的幂次累加,就是总的幂
//3.输出.....
//自己为什么没想到这个办法呢?
//因为....感觉自己智商秀下限啊.....
//还是看的代码不够多经验不够丰富....
//还要想一下有没有其他的解决办法那???
//也可以这么做
//1.在1到n中,如果一个乘积项本身就是素数,那么这个素数幂次加1
//2.如果一个乘积项不是素数,那就拆分成素数形式-如何拆分??
//3.对拆分后的项进行统计,++
#include<stdio.h>
#include<string.h>
int is_prime(int n) {
for(int i = 2; i*i <= n; i++)
if(n % i == 0) return 0;
return 1;
}
int prime[100], count = 0;
int main() {
int n, p[100];
for(int i = 2; i <= 100; i++)
if(is_prime(i)) prime[count++] = i;
while(scanf("%d", &n) == 1) {
printf("%d! =", n);
memset(p, 0, sizeof(p));
int maxp = 0;
for(int i = 1; i <= n; i++)
{
for(j=0;j<count;j++)
{
if(j==i)
{p[j]++;break}
while(m % prime[j] == 0)
{//拆分成素数形势start
//while判断:如果该素数使m的一个因子
m /= prime[j]; //那么更新m成为乘式中非素数的因子
p[j]++; //j的幂次加1
if(j > maxp) maxp = j;
}//拆分成素数形式end
}//判断是否在这个素数表里
}
for(int i = 0; i <= maxp; i++)
printf(" %d", p[i]);
printf("\n");
}
return 0;
}
#include<string.h>
int is_prime(int n) {
for(int i = 2; i*i <= n; i++)
if(n % i == 0) return 0;
return 1;
}
int prime[100], count = 0;
int main() {
int n, p[100];
for(int i = 2; i <= 100; i++)
if(is_prime(i)) prime[count++] = i;
while(scanf("%d", &n) == 1) {
printf("%d! =", n);
memset(p, 0, sizeof(p));
int maxp = 0;
for(int i = 1; i <= n; i++) {
int m = i;
for(int j = 0; j < count; j++)
while(m % prime[j] == 0) {//拆分成素数形势start
//while判断:如果该素数使m的一个因子
m /= prime[j];//那么更新m成为乘式中非素数的因子
p[j]++;//j的幂次加1
if(j > maxp) maxp = j;//拆分成素数形式end
}
}
for(int i = 0; i <= maxp; i++)
printf(" %d", p[i]);
printf("\n");
}
return 0;
}
//分析思路
//1.将n!=1*2*3...*n每一个乘积项进行素数乘积的检验,看每一项能如何用素数因子表示
//2.将素数因子的幂次累加,就是总的幂
//3.输出.....
//自己为什么没想到这个办法呢?
//因为....感觉自己智商秀下限啊.....
//还是看的代码不够多经验不够丰富....
//还要想一下有没有其他的解决办法那???
//也可以这么做
//1.在1到n中,如果一个乘积项本身就是素数,那么这个素数幂次加1
//2.如果一个乘积项不是素数,那就拆分成素数形式-如何拆分??
//3.对拆分后的项进行统计,++
#include<stdio.h>
#include<string.h>
int is_prime(int n) {
for(int i = 2; i*i <= n; i++)
if(n % i == 0) return 0;
return 1;
}
int prime[100], count = 0;
int main() {
int n, p[100];
for(int i = 2; i <= 100; i++)
if(is_prime(i)) prime[count++] = i;
while(scanf("%d", &n) == 1) {
printf("%d! =", n);
memset(p, 0, sizeof(p));
int maxp = 0;
for(int i = 1; i <= n; i++)
{
for(j=0;j<count;j++)
{
if(j==i)
{p[j]++;break}
while(m % prime[j] == 0)
{//拆分成素数形势start
//while判断:如果该素数使m的一个因子
m /= prime[j]; //那么更新m成为乘式中非素数的因子
p[j]++; //j的幂次加1
if(j > maxp) maxp = j;
}//拆分成素数形式end
}//判断是否在这个素数表里
}
for(int i = 0; i <= maxp; i++)
printf(" %d", p[i]);
printf("\n");
}
return 0;
}
相关文章推荐
- 算法竞赛经典入门-第五章阶乘的精确值
- 【py交易】算法竞赛入门经典5.4.2 因子和阶乘 Python
- 【算法竞赛入门经典】阶乘的精确值
- 算法竞赛入门经典第五章习题
- 算法竞赛入门经典-第五章TEX括号
- 算法竞赛入门经典第五章例题5-7 Ugly Numbers UVA - 136
- 算法竞赛入门经典:第五章 基础题目选解 5.9 Cantor数
- 刘汝佳 算法竞赛-入门经典 第二部分 算法篇 第五章 2(Big Number)
- 算法竞赛入门经典-第五章周期串
- 算法入门竞赛 5.4.2 因子和阶乘
- 算法竞赛入门经典:第五章 基础题目选解 5.11果园里的树
- 算法竞赛入门——因子和阶乘
- 【算法竞赛入门经典第五章:C++与STL入门
- 算法竞赛入门经典-第五章6174问题
- 算法竞赛入门经典第五章例题5-5 The SetStack Computer UVA - 12096
- 算法竞赛入门经典:第五章 基础题目选解 5.3 周期串
- 刘汝佳 算法竞赛-入门经典 第二部分 算法篇 第五章 1(String)
- 算法竞赛入门经典 第五章 字符串
- 算法竞赛入门经典 例题9-1
- 算法竞赛入门经典 8.3.2循环日程表问题