Question one
description:
回文串是从左到右或者从右到左读起来都一样的字符串,试编程判别一个字符串是否为回文串。
input:
输入一个字符串。串长度<255.
output:
判别输入的字符串是否为回文串,是输出"Y",否则输出"N"。
sample input:
abcba
sample output:
Y
program:
#include<iostream>
#include<string>
using namespace std;
int main(){
string s;
getline(cin,s); //从输入流cin输入一个字符串存放在s中,可接受空格并输出
int len=s.size(),i,j;
for (i=0,j=len-1; i<j; i++,j--) // i(从前往后)与j(从后往前)进行比较
if (s[i]!=s[j]) break; //不等则退出for循环
if (i<j) cout<<"N\n"; //若退出上步循环后i<j(字符串前后未比较完),则该字符串首尾非回文串
else cout<<"Y\n"; //反之,若i≥j (字符串前后比较结束),则该字符串为回文串
return 0;
}
Runing result:
Question two
description:
输入一个正整数,输出它的所有质数的因子(如180的质数因子为2、2、3、3、5)
sample input:
180
sample output:
2 2 3 3 5
Analysis:
质因子(或质因数)在数论里是指能整除给定正整数的质数。根据算术基本定理,不考虑排列顺序的情况下,每个正整数都能够以唯一的方式表示成它的质因数的乘积。两个没有共同质因子的正整数称为互质。因为1没有质因子,1与任何正整数(包括1本身)都是互质。只有一个质因子的正整数为质数。
将一个正整数表示成质因数乘积的过程和得到的表示结果叫做质因数分解。显示质因数分解结果时,如果其中某个质因数出现了不止一次,可以用幂次的形式表示。
例如360的质因数分解是:22233*5=360
其中的质因数2、3、5在360的质因数分解中的幂次分别是3,2,1。
因为1没有质数因子,所以在本题中质数因子从2开始找起。
program:
#include<stdio.h>
#include<math.h>
//如果n不能被所有小于等于它的平方根的整数整除,则n为素数。
int isprime(int n) { //判断整数n是否为素数
int i;
for(i=2; i<=sqrt(n); i++) {
if(n%i == 0) {
return 0;
}
if(i>sqrt(n)) {
return 1;
}
}
return 1;
}
int main() {
int i,m;
scanf("%d",&m);
for(i=2; i<=sqrt(m); i++) { //循环的次数为m的开方
if(m%i == 0) { //若输入的整数m能够被i整除
if(isprime(i)) { //则i进行质数判断
printf("%d ",i); //i为质数则输出
m /= i; //m=m/i;
i = 1; //i值变为1以便下一次可以继续执行if
}
}
}
if(i>sqrt(m)) { //若结束for循环后的i大于m的开方
printf("%d ",m); //则输出m
}
return 0;
}
Runing result:
注:为何可用sqrt()来判断质数(素数)
假如某个数n不是素数,则一定可以分解成x*y形式。
由此可以推论,n不是素数,则一定可以被某个小于n的数整除。
而对n来说,最小公因数最大只可能为n的平方根,因为假如存在一个大于n平方根的公因数x,则一定存在另一个公因数y=n/x, y<x。从上面的推理可以得出结论,如果n不能被所有小于等于它的平方根的整数整除,则n为素数。