C++题目 代码

本文提供了一系列C++编程题目,包括将十进制转换为十六进制、大数相乘、根据学生回答推断湖泊大小、寻找链表倒数第k节点、寻找数组中和为目标值的数对、广义计数问题和二叉树遍历等。文章展示了相应的算法实现和部分代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1)实现string   toHex(int)把一个十进制转换成十六进制。(完全用算法实现)

string toHex(int a)
{
    int u_value=a>0?a:-a;
    char *value=new char[10];
    value[9]='\0';
    value[8]='H';
    int position=7;
    do
    {
        int yushu=u_value%16;
        value[position--]=yushu>9?yushu+'A'-10:yushu+'0'-0;
        u_value=u_value/16;
    }while(u_value!=0);

    if(a<0)
        value[position--]='-';
    string res(value,position+1,9-(position+1)+1);
    return res;


}

比较好的方法:

//作者:sutra(只回答经典问题 只提供经典答案)
string ToHex( int i )
{
 string strHex, strCh ;
 string Table[] = {
  "0", "1", "2", "3",
  "4", "5", "5", "4",
  "8", "9", "A", "B",
  "C", "D", "E", "F"
 } ;
 while( i ) {
  strHex = Table[ i&0xF ] + strHex ;
  i >>= 4 ;
 }
 return strHex ;
}

2)实现一个计算大位数(如100位以上)相乘结果的函数string   multiply(sting,string)。(请完全用算法实现)

我开始写了int 型的multiple的相加

代码如下

int add(int a,int b)
{
	int sum=0;
	
	while(a&b!=0)/<span style="color:#ff0000;">/a&b考虑进位的时候的和 a&b   不考虑的和为 a^b   a+b=a&b<<1+a^b 由于不用加号+ </span> 
	{
		<span style="color:#ff0000;">int jin_wei=(a&b)<<1;//进位的
		a=a^b;</span>
		b=jin_wei;
		
	}
   <span style="color:#ff0000;"> a=a^b;</span>
	return a;


	
}
int multiple(int a,int b)
{
	int i,sum=0;
	<span style="color:#ff0000;">for(i=0;i<32;i++)//int 为4个字节 32位</span>
	{
		if(i>=1)
			b=b>>1;
		if(b&1==1)
		{
			sum=add(sum,(int)pow(2,(double)i)*a);
		}
	}
	return sum;
}
但是不符合本题的要求,由于大数据无法用int进行存储,用string存储

string  add(string result,int digit,int position)<span style="color:#ff0000;"> //result现在的string,表示当前乘法的临时和  position表示第几位  digit为position的数字</span>
	{
		string str;
		cout<<"result =  "<<result<<"  length()= "<<result.length()<<"  position="<<position<<endl;
		<span style="color:#ff0000;">if(result.length()<position)//当前的postion>result.length()  比如result="11" position=3 digit=4  则结果 result="411"</span>
		{
			result='0'+result;
			result[0]=digit+'0';
			return result;

		}
		
		position=result.length()-position;<span style="color:#ff0000;">//position在result中的位置</span>
		int A=digit;
		int B=result[position]-'0';
		int carry=0;
		while(A+B>9)<span style="color:#ff0000;">//进位的时候</span>
		{
			if(position==0)<span style="color:#ff0000;">//res[0]有进位的时候 要 res 0--->res.length()-1右移动后  res[0]=1</span>
			{
				result[0]=(A+B)%10+'0';
				char *tmp=new char[123];
				tmp[result.length()+1]='\0';
				
			
				for(int i=result.length()-1;i>=0;i--)
				{
					tmp[i+1]=result[i];
				}
				
				tmp[0]='0'+1;
				int i;
				for(i=0;tmp[i]!='\0';i++)
				{
					cout<<tmp[i]<<" ";
					
				}
				str.assign(tmp);
				
				
				
				return str;

   			}
			<span style="color:#ff0000;">result[position]=(A+B)%10+'0';
			carry=(A+B)/10;
			
			

			A=carry;
			position=position-1;
			B=result[position]-'0';</span>

			
		}
	    result[position]=A+B+'0';
		str=result;
		return str;

	}

string   multiply(string  str1,string str2)
	{
		int len_1=str1.length();
		int len_2=str2.length();
		int i,j;
		int carry=0,digit;
		string res;
		for(j=len_2-1;j>=0;j--)
		{
			carry=0;
			for(i=len_1-1;i>=0;i--)
			{
				digit=(str1[i]-'0')*(str2[j]-'0')+carry;
				carry=digit/10;
				digit=digit%10;
			
				cout<<"digit= "<<digit<<"  p="<<len_2+len_1-i-j-1<<endl;
				<span style="color:#ff0000;">res=add(res,digit,len_2+len_1-i-j-1);</span>

			}
			if(carry>0)//当i==0 有进位 
			{
				cout<<"carry ="<<carry<<" p= "<<len_2+len_1-i-j-1<<endl;
				<span style="color:#ff0000;">res=add(res,carry,len_2+len_1-i-
C++课程设计题目,包括1、输出10至99之间每位数的乘积大于每位数的和的数,例如对于数字12,有1*22+7,故输出该数。 2、求任意n个数中的最大数和最小数:先输入一个正整数n(个数),而后再输入任意n个实数,找出这n个数中的最大数及最小数并显示出来。3、对两个有序数组进行合并:设有如下数组A、B,并假设两个数组的元素都已经有序(从大到小降序排列)。编程序,合并A、B数组形成一个新的数组C,并使C的元素仍有序(从大到小降序排列)。 int A[10]={123, 86,80, 49,33,15,7,0,-1,-3}; int B[10]={100,64,51,50,27,19,15,12,5,2}; 4、有一个分数序列:1/2,1/3,1/4,1/5,1/6,1/7,……,编写函数求序列前n项之和,要求在主程序中提示用户输入整数n,并判断所输入数是否合法(大于1为合法),如果合法则调用求和函数并输出结果。 5、计算两个日期之间的间隔天数:从键盘输入两个日期(如以year1,month1,day1以及year2,month2,day2的方式来输入它们),而后计算出这两个日期的间隔天数并在屏幕上显示出结果。 要求编制具有如下原型的函数difs2Date: long GetDayDifference(int y1,int m1,int d1,int y2,int m2,int d2); 并在主函数中调用向屏幕上输出计算结果。7、声明并定义一个日期类CDate,其中数据成员m_iYear,m_iMonth,m_iDay,分别表示年、月、日,成员函数SetDate()用来设置年、月、日,成员函数IsLeapYear()用来判断当前的年份是否为闰年,构造函数带有默认形参值,可接收外部参数对m_iYear, m_iMonth, m_iDay进行初始化,另要求编写测试程序,定义一个CDate类对象,将其日期设置为2005年1月1日, 调用成员函数IsLeapYear()判断该年份是否为闰年,并输出判断结果. 说明:闰年的年份可以被4整除而不能被100整除,或者能被400整除. 8、编写一个程序计算两个给定长方形的面积,其中在设计类成员函数GetTotalArea()(用于计算两个长方形的总面积)时使用对象作为参数。 9、设计一个时间类Time,包括3个数据成员,时(h)、分(m)、秒(s),另外包括存取各数据成员和设置时间的成员函数,按上、下午各12小时或按24小时输出时间的成员函数,以及默认构造函数,默认时间值为0时0分0秒。 10、编写一个程序,输入3个学生的英语和计算机成绩,并按总分从高到低排序(要求设计一个学生类Student)。 11. 求解一元二次方程。 一元二次方程的定义为: ax2+bx+c=0 (1)如果b2 -4ac>0,方程有两个不同的实根,分别是: (2)如果b2 -4ac< 0,方程没有实根,但有虚根; (3)如果b2 -4ac= 0,方程有一个实根。 请你编写一个程序,使其能求出多个二次方程的根。该程序要询问用户是否想继续解下一个方程。用户输入1来继续,输入其它数字,则终止程序。程序要求用户输入a,b和c,然后根据前面的条件计算,并输出答案。 要求:使用类实现, (1) a,b,c为该类的私有成员变量; (2) 求根的实现为该类的成员函数,形式为: //函数返回值:实根的个数; //参数:x- 用以返回实根值的数组; int CalResult(double x[]); (3) 该类还包含有参构造函数、析构函数。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值