大数的加法,乘法,全排列实现

打印1到最大的n位数:

这里一个很重要的概念就是n位数,不知道n为多大,那么需要用一个字符来表示一个大数

这里用string来表示大数,为了打印的时候方便,这里需要模拟一个字符的加法操作

另外,之前实现过大数的乘法,异曲同工:

http://blog.csdn.net/xietingcandice/article/details/44729323

#include<iostream>
#include<string>

using namespace std;
int Incrument(string& num,int n)
{
	int length = num.length();
	bool overflag = false;
	int nextflag = 0;//<标示进位符号
	for (int i = length-1; i>=0;i--)
	{
		int nSum = num[i]-'0'+nextflag;
		if (i == length-1)
		{
			nSum++;//<最后一位加上1
		}
		if (nSum < 10)
		{
			num[i] = nSum+'0';
			break;
		}
		if (nSum >= 10)
		{
			if (i == 0 && length == n)//<标示最高位进位了,标识需要退出程序
			{
				overflag = true;
				break;
			}
			num[i] = nSum-10+'0';
			nextflag = 1;
			if (i == 0)//<如果最低位进位,那么string需要扩展,如果这里不用string利用char那么在输出的时候有一定操作
			{
				num = '1'+num;
			}

		}
	}
	return overflag;
}
void PrintNum(string num)
{
	for (int i = 0; i < num.length(); i++)
	{
		cout << num[i];
	}
	cout << endl;
}
void PrintMax(int n)
{
	string num = "0";//<输出的数据
	if(n == 0)
	{
		return;
	}
	while (!Incrument(num,n))
	{
		PrintNum(num);
	}
}

int main()
{
	PrintMax(4);
	return 0;
}

因为题目是只需要打印出这些数据,因此也可以直接利用数字的全排列的特点:

全排列,基本就是一个循环加上遍历的过程

#include<iostream>
#include<string>

using namespace std;
void PrintNum(char* num,int n)
{
	int flag = true;
	for (int i =  0; i <n; i++)
	{
		if(flag)
		{
			if (num[i] == '0')
			{
				continue;
			}
			else
			{
				cout<<num[i];
				flag = false;
			}
		}
		else
		{
			cout<<num[i];
		}
	}
	if (!flag)
	{
		cout<<endl;
	}
}
void PrintRecursively(char* num, int n, int index)
{
	if(index == 0)
	{
		PrintNum(num,n);
		return;
	}
	for (int i = 0; i < 10; i++)
	{
		num[index-1] = i+'0';
		PrintRecursively(num,n,index-1);
	}

}
void PrintMax(int n)
{
	char *num = new char[n];
	if(n == 0)
	{
		return;
	}
	for (int i = 0; i < 10; i++)
	{
		num[n-1] = i+'0';
		PrintRecursively(num,n,n-1);
	}

	delete []num;
}

int main()
{
	PrintMax(2);
	return 0;
}
时间: 2024-11-05 13:47:46

大数的加法,乘法,全排列实现的相关文章

剑指offer编程题Java实现——面试题12相关题大数的加法、减法、乘法问题的实现

用字符串或者数组表示大数是一种很简单有效的表示方式.在打印1到最大的n为数的问题上采用的是使用数组表示大数的方式.在相关题实现任意两个整数的加法.减法.乘法的实现中,采用字符串对大数进行表示,不过在具体的计算中,还是要将字符串转化成字符数组来进行计算. 实现两个大数的加法,要考虑到两个问题,两个数的和的位数问题,以及如何处理两个数按位相加产生的进位问题.首先两个整数相加,两个数的和的位数最多比最大的整数的位数多1:这样和的位数就确定了.对于进位问题,我的做法是先进行按位相加,相加操作完成后再按照

大数加法乘法

大数加法乘法: 1 /* 2 2015.4 3 大数加法,乘法 4 5 */ 6 #include <iostream> 7 #include <string> 8 #include <vector> 9 10 using namespace std; 11 #define MAX 99 12 #define MAXM 200 13 14 void BigNumAdd() 15 { 16 char strA[MAX], strB[MAX]; 17 cout <&l

大数相乘&mdash;&mdash;模拟乘法的运算规则

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> int main() { void add(int a[], int length1, int b[], int length2); char str1[255], str2[255]; int num1[255] = { 0 }, num2[255] = { 0 }; int product[255] = { 0 }, temp[255] =

POJ 1001 Exponentiation 无限大数的指数乘法 题解

POJ做的非常好,本题就是要求一个无限位大的指数乘法结果. 要求基础:无限大数位相乘 额外要求:处理特殊情况的能力 -- 关键是考这个能力了. 所以本题的用例特别重要,再聪明的人也会疏忽某些用例的. 本题对程序健壮性的考查到达了变态级别了. 某人贴出的測试用例数据地址: http://poj.org/showmessage?message_id=76017 有了这些用例,几下调试就过了. 我关键漏了的用例: 000.10  1 000000  1 000.00  1 .00000  0 0000

YT15-HDU-How many fibs(大数相加法)

Problem Description Recall the definition of the Fibonacci numbers: f1 := 1 f2 := 2 fn := fn-1 + fn-2 (n >= 3) Given two numbers a and b, calculate how many Fibonacci numbers are in the range [a, b]. Input The input contains several test cases. Each

vector、string实现大数加法乘法

理解 vector 是一个容器,是一个数据集,里边装了很多个元素.与数组最大的不同是 vector 可以动态增长. 用 vector 实现大数运算的关键是,以 string 的方式读入一个大数,然后将字串的每一个字符 s[i] 以 int 形式赋给 vector<int> a 中的每一个元素.然后将 a[i] 和 a[j] 加起来(或者乘起来).每两个元素加起来的结果 <= 18,乘起来的结果 <= 81. 用 string 实现大数加法的方法跟 vector 差不多,但是用 st

[acm 1001] c++ 大数加法 乘法 幂

北大的ACM 1001 poj.org/problem?id=1001 代码纯手动编写 - - 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 5 6 class BigNumber 7 { 8 struct BigNumberNode 9 { 10 BigNumberNode():n(0), prev(NULL), next(NULL){} 11 BigNumberNode(int N)

大数加减乘法

大数的相关计算问题一直是编程比赛常考的题目,在蓝桥杯比赛之前又把大数的加减乘法做了一遍.大数除法比较难,还没有去尝试实现,以后有机会了再继续补全好了. 算法分析:三种方法相似,都是按位操作,动态存储.处理好输入数据后,对每一位的逐个操作,很容易得到答案. 大数加法 #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #define MAX 1010 using n

十进制大数的加法运算

输入文件的第一行为一个整数N,表示输入文件中接下来有N组数据,没组数据最多包含100行,每行有一个非常长的十进制整数组成,这个整数的长度不会超过100个字符,而且只包含数字,每组数据的最后一行为0,表示这组数据结束. 对输入文件的每组数据,输出他们的和. 此题不同于两大数相加,是多个大数相加的问题,在求和时,有其独到之处:竖式加法 #include<iostream> #include<stdio.h> #include<string.h> const int M=20