数学问题
P进制转Q进制
#include<stdio.h>
//1.P进制x转十进制y
int turnten(int P,int x){
int y=0,product=1;
while(x!=0){
y=y+(x%10)*product;
x=x/10;
product=product*P;
}
return y;
}
//2.十进制y转Q进制z
void turnQ(int Q,int y){
int z[40],num=0;
do{
z[num++]=y%Q;
y=y/Q;
}while(y!=0);
for(int i=0;i<num;i++){
printf("%d",z[i]);
}
}
int main(){
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
int m=turnten(a,b);
turnQ(c,m);
return 0;
}
最大公约数/最小公倍数
L:3和9最大公约数3
gcd(a,b)=gcd(b,a%b) gcd(a,0)=a
L:3和9最小公倍数9
lcm(a,b)=a/d*b (d是a和b最大公约数)
int gcd(int a,int b){
return !b?a:gcd(b,a%b);
}
分数的表示/化简/分数的四则运算/输出
#include<stdio.h>
#include<math.h>
typedef long long ll;
//分数的表示
struct fraction{
int up,down;
};
//分数的化简
int gcd(int a,int b){
return !b?a:gcd(b,a%b);
}
fraction reduction(fraction result){
//分母为负数
if(result.down<0) {
result.up=-result.up;
result.down=-result.down;
}
if(result.up==0) result.down=1;
else {
int d=gcd(abs(result.up),abs(result.down));
result.up/=d;
result.down/=d;
}
return result;
}
//分数的加法
fraction add(fraction f1,fraction f2){
fraction result;
result.up=f1.up*f2.down+f2.up*f1.down;
result.down=f1.down*f2.down;
return reduction(result);
}
//分数的减法
fraction sub(fraction f1,fraction f2){
fraction result;
result.up=f1.up*f2.down-f2.up*f1.down;
result.down=f1.down*f2.down;
return reduction(result);
}
//分数的乘法
fraction multi(fraction f1,fraction f2){
fraction result;
result.up=f1.up*f2.up;
result.down=f1.down*f2.down;
return reduction(result);
}
//分数的除法
fraction divide(fraction f1,fraction f2){
fraction result;
result.up=f1.up*f2.down;
result.down=f1.down*f2.up;
return reduction(result);
}
//分数的输出
void show(fraction result){
if(result.down==1) printf("%lld\n",result.up);
else if(result.up>result.down)
{printf("%d%d/%d\n",result.up/result.down,abs(result.up)%result.down,result.down);}
else {printf("%d/%d\n",result.up,result.down);}
}
int main(){
printf("请输入所需要的进行运算的两个分数\n");
fraction f1,f2,r;
scanf("%d/%d %d/%d",&f1.up,&f1.down,&f2.up,&f2.down);
printf("加减乘除运算结果如下\n");
show(add(f1,f2));
show(sub(f1,f2));
show(multi(f1,f2));
show(divide(f1,f2));
return 0;
}
素数的判断和获取
bool isPrime(int n){
if(n<=1) return false;
int sqr=(int)sqrt(1.0*n);
for(int i=2;i<=sqr;i++){
if(n%i==0) return false;
}
return true;
}
#include<stdio.h>
#include<math.h>
const int maxn=101;
int prime[maxn],pNum=0;//存放所有素数 pNum为素数个数
bool p[maxn]={0};//i是素数,p[i]=false
bool isPrime(int n){
if(n<=1) return false;
int sqr=(int)sqrt(1.0*n);
for(int i=2;i<=sqr;i++){
if(n%i==0) return false;
}
return true;
}
void find_prime(){
for(int i=2;i<maxn;i++){
if(p[i]==false){ //i是素数
prime[pNum++]=i;
for(int j=i+1;j<maxn;j+=i) p[j]=true;//筛去倍数(筛去不是素数的)
}
}
}
int main(){
printf("获取100以内所有素数:\n");
find_prime();
for(int i=0;i<pNum;i++){
printf("%d ",prime[i]);
}
return 0;
}
☆ for(int j=i+1;j<maxn;j+=i) p[j]=true;//筛去倍数(筛去不是素数的)
质因子分解
#include<stdio.h>
#include<math.h>
const int maxn=100010;
int prime[maxn],pNum=0;
bool p[maxn]={0};
int n,num=0;
bool isPrime(int n){
if(n<=1) return false;
int sqr=(int)sqrt(1.0*n);
for(int i=2;i<=sqr;i++){
if(n%i==0) return false;
}
return true;
}
void find_prime(){
for(int i=1;i<maxn;i++){
if(isPrime(i)==true){
prime[pNum++]=i;
}
}
}
struct factor{
int x,cnt;//质因子、个数
}fac[10];
void is_factor(int n){
int sqr=(int)sqrt(1.0*n);
for(int i=0;i<pNum&&prime[i]<=sqr;i++){
if(n%prime[i]==0){
fac[num].x=prime[i];
fac[num].cnt=0;
while(n%prime[i]==0){
fac[num].cnt++;
n/=prime[i];
}
num++;
}
}
if(n!=1){
fac[num].x=n;
fac[num++].cnt=1;
}
}
int main(){
find_prime();
scanf("%d",&n);
if(n==1) printf("1=1");
else{
is_factor(n);
printf("%d=",n);
for(int i=0;i<num;i++){
if(i>0) printf("*");
printf("%d^%d",fac[i].x,fac[i].cnt);
}
}
return 0;
}
大整数运算
nt类型的最大值:2,147,483,647
int类型的最小值:-32,768 to 32,767
#include<stdio.h>
#include<string.h>
typedef long long ll;
struct bign{
int d[1000];
int len;
bign(){
memset(d,0,sizeof(d));//初始化
len=0;
}
};
bign change(char str[]){//字符串读入转化为bign
bign a;
a.len=strlen(str);
for(int i=0;i<a.len;i++){
a.d[i]=str[a.len-i-1]-'0';//逆着赋值
}
return a;
}
int compare(bign a,bign b){
if(a.len>b.len) return 1;//a>b
else if(a.len<b.len) return -1;//a<b
else{
for(int i=a.len-1;i>=0;i--){
if(a.d[i]>b.d[i]) return 1;//a>b
else if(a.d[i]<b.d[i]) return -1;//a<b
}
return 0;//a=b
}
}
bign add(bign a,bign b){
bign c;//存放结果
int carry=0;//进位
for(int i=0;i<a.len||i<b.len;i++){
int temp=a.d[i]+b.d[i]+carry;
c.d[c.len++]=temp%10;
carry=temp/10;
}
if(carry!=0) c.d[c.len++]=carry;
return c;
}
bign sub(bign