大整数的运算

这篇文章包含四个编程问题的解决方案:任意进制转换,统计阶乘数中数字“0”的个数,将十进制正整数分解为质因数形式,以及删除数组中重复的元素。每个问题都提供了C++语言的代码示例,展示了不同的算法思路和处理方法。
摘要由CSDN通过智能技术生成

1.任意进制的转换

思路:用数组去存储十进制数提取出来的 每一位数,然后倒序输出
这是我刚开始的做法很显然是错误的,因为我没考虑到10A11B12C13D14E15F

#include<bits/stdc++.h>
using namespace std;
int function(int n)
{
	if(n==0)return 1;
	if(n==1)return 1;
	else
	 return function(n-1)*n;
}
int main()
{
	int p,n,m,t[1001],i=0,j;
	cin>>n>>p;
	m=function(n);
	while(n){    //while后面的括号中是n而不是n/p了这一点要记住 
		t[i]=n%p;
		n=n/p;
		i++;
		
	}
	
			for(j=i-1;j>=0;j--)  //上面程序多加了一个i,所以这里是i-1 
	cout<<t[j];
}

正确做法

#include <stdio.h>
#include <iostream>

using namespace std;
int main()
{ int n,p;
  void change(int n,int p);
  cout<<"Please input a positive integer n:";
  cin>>n;
  cout<<"Please input the base of a target system:";
  cin>>p;
  change(n,p);
  return 0;
}

void change(int n,int p)
{int i,a[1000];
 char d[]="0123456789ABCDEF";
 i=-1;
 while (n)
  {i++;a[i]=n%p;n=n/p;}
 while(i>=0)
  {printf("%c",d[a[i]]); i--;}
  cout<<endl;
}
2.统计n!中数字“0”的个数
#include<bits/stdc++.h>
using namespace std;
int function(int n)
{
	if(n==0)return 1;
	if(n==1)return 1;
	else
	return function(n-1)*n;
}
int main()
{
	int n,i=0,count=0,a[1001];
	cin>>n;
	int m = function(n);
	while(m)
	{
		a[i]=m%10;
		m=m/10;
		i++;
	}
for(int j=0;j<i;j++)
{
	if(a[j]==0)
	count++; 
	}
	cout<<count<<endl;	
}
3.输入一个int型十进制正整数,将其分解成质因数的形式如90=23^25
#include<bits/stdc++.h>
using namespace std;
bool Prime(int n)
{
	int s=0,i;
	for(i=1;i<=n;i++)
	{
		if(n%i==0)
		s++;
		
	}
	if(s==2)
	return true;
	else return false;
}
int main()
{
	int n;
	cin>>n;
	printf("%d=",n);
	for(int i=2;i<=n;i++)
	{
	   int count=0;
	if(Prime(i))
	{
	    while(n%i==0)
		{
			n=n/i;
			count++;
		}
		if(count==1)
		{
			printf("%d",i);
		
		if(n>1)cout<<"*";  //输出一个数后后面还可以乘以一个数用cout 
	}
		if(count>1)
		{
			printf("%d^%d",i,count);
			if(n>1) cout<<"*";
		}
		
	}
	}
	
}
4.删除数组中重复的元素,即数组中相同的元素只保留一个

思路:找到要删除的元素的位置,然后后面的元素全部向前移动

#include<stdio.h>
int main(void)
{
	int i,n,a[100];
	int j, temp;
	printf("输入元素的个数:");
	scanf("%d",&n);
	for(i=0;i<n;i++)
		scanf("%d",&a[i]);	//循环输入n个数
	for(i=0;i<n;i++)		//循环判断数组中每一个数
	{
		for(j=i+1;j<n;j++)	//判断a[i]后边的数是否和a[i]相等
		{
			if(a[i]==a[j])
			{
				for(temp = j;temp<n-1;temp++)
					a[temp]=a[temp+1];	//将a[j]后面的元素全往前移一个位置
				j--;	//a[j+1]取代a[j]位置,为使下次从a[j+1]开始查找,j减一(为使j保持不变)
				n--;	//数组长度减一
			}
		}
	}
	printf("剩余元素个数: %d\n",n);
	for(i=0;i<n;i++)
		printf("%d ",a[i]);
	printf("\n");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值