L1-006 连续因子【这一题好难啊】
一个正整数 N 的因子中可能存在若干连续的数字。例如 630 可以分解为 3×5×6×7,其中 5、6、7 就是 3 个连续的数字。给定任一正整数 N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。
输入格式:
输入在一行中给出一个正整数 N(1<N<231)。
输出格式:
首先在第 1 行输出最长连续因子的个数;然后在第 2 行中按
因子1*因子2*……*因子k
的格式输出最小的连续因子序列,其中因子按递增顺序输出,1 不算在内。输入样例:
630
输出样例:
3 5*6*7
#include <iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int main()
{
int n;
cin>>n;//输入
/*
//思路:【1】用一个数组装所有因子(注意判断条件用sqrt(n)+1
[2]最长的连续因子的乘积和要是n的因子
【3】记录最长连续因子的长度 和在数组中的位置,方便打印
*/
//1.用for循环找到所有因子
int a[100];//存放因子的数组
int p=0;//数组的序号,下标
for(int i=2;i<=sqrt(n)+1;i++){
if(n%i==0)a[p++]=i;
}
if(p==0)a[p++]=n;//判断为素数的情况
//2.判断每一个因子的连续因子序列,最长的连续因子序列的乘积要是n的因子
int product=1;//因子的乘积
int x=1;//记录因子的个数
int max=1;//记录最长的连续因子数
int y=0;//记录最长连续因子序列在数组a的第一个数序号
for(int i=0;i<p;i++){
product=a[i];
x=1;
for(int j=i+1;j<p;j++){
//先判断是否连续
if(a[j-1]+1==a[j]){
product*=a[j];
if(n%product==0){
x++;
if(x>max){
max=x;
y=i;
}
}else j=p;
}else j=p;
}
}
cout<<max<<endl;
for(int i=y;i<y+max;i++){
if(i!=y+max-1)cout<<a[i]<<"*";
else cout<<a[i];
}
return 0;
}
L1-007 念数字
输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出
fu
字。十个数字对应的拼音如下:0: ling 1: yi 2: er 3: san 4: si 5: wu 6: liu 7: qi 8: ba 9: jiu
输入格式:
输入在一行中给出一个整数,如:
1234
。提示:整数包括负数、零和正数。
输出格式:
在一行中输出这个整数对应的拼音,每个数字的拼音之间用空格分开,行末没有最后的空格。如
yi er san si
。输入样例:
-600
输出样例:
fu liu ling ling
#include<stdio.h>
#include<string.h>
int main()
{
char a[10][10] = {"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"}; //用字符型数组和数字建立联系
char shuzi[1000];
gets(shuzi);
int m = strlen(shuzi);
for(int i = 0; i <= m - 1; i++)
{
if(shuzi[i] == '-') printf("fu");
else printf("%s",a[shuzi[i] - 48]);
if(i != m - 1) printf(" ");
}
}
L1-008 求整数段和
给定两个整数A和B,输出从A到B的所有整数以及这些数的和。
输入格式:
输入在一行中给出2个整数A和B,其中−100≤A≤B≤100,其间以空格分隔。
输出格式:
首先顺序输出从A到B的所有整数,每5个数字占一行,每个数字占5个字符宽度,向右对齐。最后在一行中按
Sum = X
的格式输出全部数字的和X
。输入样例:
-3 8
输出样例:
-3 -2 -1 0 1 2 3 4 5 6 7 8 Sum = 30
#include<stdio.h>
int main(void)
{
int a,b,i,count,sum;
scanf("%d %d",&a,&b);
count = 0;
sum = 0 ;
for(i=a;i<=b;i++){
sum += i;
printf("%5d",i);
count++;
//为什么还要保证i!=b呢
if(count%5==0&&i!=b){
printf("\n");
}
}
printf("\n");
printf("Sum = %d\n",sum);
return 0;
}
L1-009 N个数求和【这一题我更是不会。】
本题的要求很简单,就是求
N
个数字的和。麻烦的是,这些数字是以有理数分子/分母
的形式给出的,你输出的和也必须是有理数的形式。输入格式:
输入第一行给出一个正整数
N
(≤100)。随后一行按格式a1/b1 a2/b2 ...
给出N
个有理数。题目保证所有分子和分母都在长整型范围内。另外,负数的符号一定出现在分子前面。输出格式:
输出上述数字和的最简形式 —— 即将结果写成
整数部分 分数部分
,其中分数部分写成分子/分母
,要求分子小于分母,且它们没有公因子。如果结果的整数部分为0,则只输出分数部分。输入样例1:
5 2/5 4/15 1/30 -2/60 8/3
输出样例1:
3 1/3
输入样例2:
2 4/3 2/3
输出样例2:
2
输入样例3:
3 1/3 -1/6 1/8
输出样例3:
7/24
#include <stdio.h>
long long int gcd(long long int a,long long int b)
//这个地方还是和之前一样,求一个最大公约数,去化简分数(辗转相除法)
{
long long int j;
if(a>=b)
{
while(b!=0)
{
j = b;
b = a%b;
a = j;
}
return a;
}
else if(a<b)
{
while(a!=0)
{
j = a;
a = b%a;
b = j;
} return b;
}
}
int main()
{
int N,i,j;
scanf("%d",&N);//输入分数的个数
long long int num1,num2,sum1 = 0,sum2 = 1;
for(i = 0;i<N;i++)
{
scanf("%lld/%lld",&num1,&num2);//输入分数
sum1 *= num2;
sum1 += num1 * sum2;
sum2 *= num2;
//做两个分数的加法,先获取分母的值,然后分母乘分子的值直接相交求和,分母只做乘法
j = gcd(sum1,sum2);//求最大公约数
sum1 /= j;
sum2 /= j;//化简
}
if(sum1%sum2 == 0)printf("%lld",sum1/sum2);//整数
else if(sum1/sum2 == 0)printf("%lld/%lld",sum1%sum2,sum2);//纯分数
else printf("%lld %lld/%lld",sum1/sum2,sum1%sum2,sum2);//整数分数混合
}
L1-010 比较大小
本题要求将输入的任意3个整数从小到大输出。
输入格式:
输入在一行中给出3个整数,其间以空格分隔。
输出格式:
在一行中将3个整数从小到大输出,其间以“->”相连。
输入样例:
4 2 8
输出样例:
2->4->8
#include<stdio.h>
int main(void)
{
int a[3] ,i,j,t;
for(i=0;i<3;i++){
scanf("%d",&a[i]);
}
for(i=1;i<3;i++){
for(j=0;j<3-i;j++){
if(a[j]>a[j+1]){
t= a[j];a[j]=a[j+1];a[j+1] = t; }
}
}
for(i=0;i<3;i++){
if(i!=0) printf("->");
printf("%d",a[i]);
}
return 0;
}