精华内容
下载资源
问答
  • 超出int范围的整数匹配与排序方法

    千次阅读 2014-07-05 10:33:01
    本文讨论的是超出int范围的整数


    输入一行数字(数字最长可达20位,整数),数字之间用空格分隔;第二行输入模式数字(长度可达20位整数);按增序输出第一行匹配的数字


    因为是大整数,所以输入不能用int存,需要用字符串存储,转化为字符串的匹配与排序(先求长排序,若相等再用strcmp)


    用到的函数:

    1. strstr() 判断是否是子串

    2. strcmp() 字符串比较(字典序)

    3. strcpy() 字符串复制


    #include <iostream>
    #include <cstring>
    
    
    using namespace std;
    
    void printSortString()
    {
    	char s[1000];
    	gets(s);
    	char T[20];//考虑长串数字;
    	gets(T);
    	char *data[50];
    
    	int i=0;
    	int j =0;
    	int k=0;
    	/**输入格式必须保证数字之间有空格,最后一个数字先空格再回车*/
    	while(s[i]!='\0')
    	{
    		data[j] = (char *)malloc(50);
    		while(s[i]!=' ')
    		{			
    			data[j][k++] = s[i++] ;
    		}
    		data[j][k]='\0';
    		j++;
    		i++;
    		k=0;
    	}
    	char *output[50];
    	int num = 0;
    	for(int m=0;m<j;m++)
    	{
    		if(strstr(data[m],T))
    		{
    			output[num] = (char *)malloc(50);
    			strcpy(output[num],data[m]);
    			num++;
    		}
    	}
    	
    	
    	for(int i=0;i<num;i++)
    	{
    		for(int j=1;j<num-i;j++)
    		{
    			if(strlen(output[j-1]) > strlen(output[j]))
    			{
    				char *temp;
    				temp = (char *)malloc(50);
    				strcpy(temp,output[j-1]);
    				strcpy(output[j-1],output[j]);
    				strcpy(output[j],temp);
    				free(temp);
    			}
    			else if(strlen(output[j-1]) == strlen(output[j]))
    			{
    				if(strcmp(output[j-1],output[j]) > 0 )
    				{
    					char *temp;
    					temp = (char *)malloc(50);
    					strcpy(temp,output[j-1]);
    					strcpy(output[j-1],output[j]);
    					strcpy(output[j],temp);
    					free(temp);
    				}
    			}
    		}
    	}
    	
    	for(int i=0;i<num;i++)
    		printf("%s ",output[i]);
    }
    
    int main()
    {
    	printSortString();
    	system("pause");
    	return 0;
    }


    附上在int范围内的整数匹配与排序

    /**int范围内的正整数匹配与排序*/
    void FindNumAnfSort()
    {
    	int data[100];
    	int i=0;
    	//如何判断第一行输入结束?
    	char c =' ';
    	while(c!='\n')
    	{
    		scanf("%d%c",&data[i++],&c);
    	}
    	int num = i;
    	int T,temp;
    	scanf("%d",&T);
    	//判断T是几位数
    	int len=0;
    	int TT=T;
    	while(T)
    	{
    		len ++;
    		T = T/10;
    	}
    	//判断T是否在data[i]中
    	int mod;
    	mod =1;
    	for(i = 0;i<len;i++)
    	{
    		mod = mod * 10;
    	}
    
    	int rightdata[100],k;
    	k = 0;
    	for(i=0;i<num;i++)
    	{
    		temp = data[i];
    		while(temp)
    		{
    			if(temp%mod == TT)
    			{
    				rightdata[k++] = data[i];
    				break;
    			}
    			else
    			{
    				temp = temp/10;
    			}
    		}
    	}
    
    	sort(rightdata,rightdata+k);
    	/*
    	for(i=0;i<k;i++)
    	{
    		for(int j=1;j<k-i;j++)
    		{
    			if(rightdata[j-1]>rightdata[j])
    			{
    				int sort;
    				sort = rightdata[j-1];
    				rightdata[j-1] = rightdata[j];
    				rightdata[j] = sort;
    			}
    		}
    	}
    	*/
    	for(i = 0;i<k;i++)
    		printf("%d ",rightdata[i]);
    
    }


    展开全文
  • int  a=strlen(p);    int  b=strlen(s);    //flag为判断相加后前面的数字是否会大于9的下标...因为大于9就要逐渐往前位进1     int  flag=0;    if (a>b) //如果p的数字比s的数字长。。    {    ...

    原文链接:https://blog.csdn.net/huijiaaa1/article/details/79736375

    上学期在学校参加一个比赛,今晚偶尔想起上学期比赛出的比较简单的一道题。就晒出来看看。今晚再敲了一边代码 。15分钟搞定... 什么...这么简单的我竟然用了十五分钟。。哈哈 当然还要写注释啊 辛苦。。

    [cpp]  view plain  copy
    1. #include<stdio.h>  
    2. #include<string.h>  
    3. void fun(char *p,char *s)  
    4. {  
    5.     //首先强调 两个数字加的时候是从后往前加。即字符串从后到前移动...  
    6.    int a=strlen(p);  
    7.    int b=strlen(s);  
    8.    //flag为判断相加后前面的数字是否会大于9的下标...因为大于9就要逐渐往前位进1  
    9.    int flag=0;  
    10.    if(a>b)//如果p的数字比s的数字长。。  
    11.    {  
    12.        while(b!=0)//当s没有到头的时候 循环一直往前走   
    13.        {  
    14.              p[--a]+=s[--b]-48;//把结果存到数字长的那个数组里。 这句代码的意义是:算出相加后的数字的ascii值  
    15.              flag=a;        //flag保持标志位下标最新值  
    16.              while(p[flag]>'9'&&flag!=0)//如果加了后进位前面数字大于9 一直往前加  
    17.              {  
    18.                    
    19.                   
    20.                     p[flag]=p[flag]-58+'0'//数字大于9的话,那么就减去这个差值 。至于为什么减58,因为没有10的ascii码,所以用58代替  
    21.                     p[--flag]+=1;  
    22.                    
    23.              }  
    24.        }  
    25.   
    26.    }  
    27.    else  
    28.    {//如果第二个数字长度大于等于第一个数字  
    29.      while(a!=0)  
    30.        {  
    31.              s[--b]+=p[--a]-48;  
    32.              flag=b;  
    33.              while(s[flag]>'9'&&flag!=0)  
    34.              {  
    35.                    
    36.                     s[flag]=s[flag]-58+'0';   
    37.                     s[--flag]+=1;   
    38.   
    39.              }  
    40.        }//前面这些套路跟上一个一样  
    41.     for(int c=0;c<(int)strlen(s);c++)//这个for循环时把s指向的数组赋值给p 为什么要这么做?因为最后输出的结果时p数组。  
    42.     {  
    43.         p[c]=s[c];  
    44.     }  
    45.     p[c]='\0';//千万不要忘记赋结束符了。  
    46.    }  
    47.     
    48. }  
    49. int main(char args[])  
    50. {  
    51.     while(1)  
    52.     {  
    53.         char one[20],two[20],*p=one,*s=two;  
    54.         one[0]=two[0]='0';//考虑到数字要进位,所以把数组第一位都赋值为0   
    55.         puts("请输入第一个数字:");  
    56.         scanf("%s",p+1);//从数组的下标为1的地址输入  
    57.         puts("请输入第二个数字:");  
    58.         scanf("%s",s+1);  
    59.         fun(one,two);  
    60.         puts("相加结果:");  
    61.         if(one[0]=='0')//如果数组第一位是0,那么说明没有进位,则从下标为1进行输出数组  
    62.             puts(p+1);  
    63.         else  
    64.         puts(p);  
    65.     }  
    66.   
    67.     return 0;  
    68.   
    69. }  


    运行结果:


    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huijiaaa1/article/details/79736375
    个人分类:  c指针
    展开全文
  • int a=strlen(p); int b=strlen(s); //flag为判断相加后前面的数字是否会大于9的下标...因为大于9就要逐渐往前位进1 int flag=0; if(a>b)//如果p的数字比s的数字长。。 { while(b!=0)//当s没有到头的时候 ...

      上学期在学校参加一个比赛,今晚偶尔想起上学期比赛出的比较简单的一道题。就晒出来看看。今晚再敲了一边代码 。15分钟搞定... 什么...这么简单的我竟然用了十五分钟。。哈哈 当然还要写注释啊 辛苦。。

    #include<stdio.h>
    #include<string.h>
    void fun(char *p,char *s)
    {
    	//首先强调 两个数字加的时候是从后往前加。即字符串从后到前移动...
       int a=strlen(p);
       int b=strlen(s);
       //flag为判断相加后前面的数字是否会大于9的下标...因为大于9就要逐渐往前位进1
       int flag=0;
       if(a>b)//如果p的数字比s的数字长。。
       {
           while(b!=0)//当s没有到头的时候 循环一直往前走 
           {
                 p[--a]+=s[--b]-48;//把结果存到数字长的那个数组里。 这句代码的意义是:算出相加后的数字的ascii值
                 flag=a;		//flag保持标志位下标最新值
                 while(p[flag]>'9'&&flag!=0)//如果加了后进位前面数字大于9 一直往前加
                 {
                     
    				
    					p[flag]=p[flag]-58+'0'; //数字大于9的话,那么就减去这个差值 。至于为什么减58,因为没有10的ascii码,所以用58代替
    					p[--flag]+=1;
    				 
                 }
           }
    
       }
       else
       {//如果第二个数字长度大于等于第一个数字
    	 while(a!=0)
           {
                 s[--b]+=p[--a]-48;
                 flag=b;
                 while(s[flag]>'9'&&flag!=0)
                 {
    				 
    					s[flag]=s[flag]-58+'0'; 
    					s[--flag]+=1; 
    
                 }
           }//前面这些套路跟上一个一样
    	for(int c=0;c<(int)strlen(s);c++)//这个for循环时把s指向的数组赋值给p 为什么要这么做?因为最后输出的结果时p数组。
    	{
    		p[c]=s[c];
    	}
    	p[c]='\0';//千万不要忘记赋结束符了。
       }
      
    }
    int main(char args[])
    {
    	while(1)
    	{
    		char one[20],two[20],*p=one,*s=two;
    		one[0]=two[0]='0';//考虑到数字要进位,所以把数组第一位都赋值为0 
    		puts("请输入第一个数字:");
    		scanf("%s",p+1);//从数组的下标为1的地址输入
    		puts("请输入第二个数字:");
    		scanf("%s",s+1);
    		fun(one,two);
    		puts("相加结果:");
    		if(one[0]=='0')//如果数组第一位是0,那么说明没有进位,则从下标为1进行输出数组
    			puts(p+1);
    		else
    		puts(p);
    	}
    
        return 0;
    
    }
    

     

     

    运行结果:

     

     

    展开全文
  • 两个int类型的数据相加,有可能会出现超出int的表示范围。 来源:https://www.cnblogs.com/zhuyeshen/p/10685123.html /* 移位运算符: <<(左移) 规律:一个操作数进行左移运算的时候,结果就是等于操作数乘以...

    两个int类型的数据相加,有可能会出现超出int的表示范围。
    来源:https://www.cnblogs.com/zhuyeshen/p/10685123.html
    /*
    移位运算符
    <<(左移)
    规律:一个操作数进行左移运算的时候,结果就是等于操作数乘以2的n次方,n就是左移 的位数.

        3<<1 = 3 *2(1) = 6;
        3<<2 = 3*2(2) = 12
        3<<3 = 3*2(3) = 24
     
    
        >>(右移)
    

    规律:一个操作数在做右移运算的时候,实际上就是等于该操作数除以2的n次方,n就是右移的位数。

    3>>1 = 3 / 2(1) = 1
    3>>2 = 3 / 2(2) = 0 。。
    
    
    >>>(无符号右移) :
    

    无符号右移与右移的区别:进行右移运算的时候,如果操作数是一个正数,那么左边的空缺位使用0补,
    如果操作数是一个负数,那么左边的空缺位使用1补。而使用无符号右移的时候,不管是正数还是负数都
    统一使用0补。

    三元运算符要注意的细节
    使用三元运算符的时候,一定要使用该表达式返回的结果,或者是定义一个变量接收该表达式返回的结果。

    展开全文
  • //fmt.Println("转换成功",number_int) } else { fmt . Println ( "转换错误," , error ) } return number_int } //补位函数用来在两串数字不一样长的时候在 少的数字串前加入适量得0 使两串数字 ...
  • int的取值范围

    万次阅读 多人点赞 2019-08-05 21:19:38
    在学C++或者Java的时候应该都会先了解各种基本数据类型的初值和它们的取值范围,有些人可能会不太重视这块内容,其实很重要,很多大公司面试的过程中都会问到int的取值范围,溢出之后会怎么样等问题。 正文 首先来...
  • 我们知道String.hashCode()返回的是一个int类型的数值,那当某个字符串的hash值超出int的最大范围后会发生什么呢? 首先我们来看下String.hashCode()的源码,看看它是如何计算一个字符串的hash值: /** The value ...
  • sum := int(c1) + int(c2) + left if sum >=10 { left = 1 } else { left = 0 } c3 := (sum % 10) + '0' //fmt.Printf("c3__%c,result:%s\n",c3,result) result = fmt.Sprintf("%c%s",c3,result...
  • 主要介绍了Go返回int64类型字段超出javascript Number范围的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 一、正常声明一个long型数据,结果显示:类型int的文字xxxx超出范围 二、为什么会这样呢? 问题出在数据的默认格式上,Java中整数默认是以int类型存储的,如果要使用long型数据,就需要在后面标明“L”或者“l...
  • C,int64_t超出范围

    2016-04-06 14:49:46
    int main(void) { //int64_t a=-(9223372036854775807)-1; //-(2^63-1)-1,这么赋值不报警 int64_t a=-9223372036854775808; //-2^63,这样就报警 printf("%zu\n", sizeof(int64_t)); printf("%016lx...
  • unsigned int 0~4294967295  int 2147483648~2147483647  unsigned long 0~4294967295 long 2147483648~2147483647 long long的最大值:9223372036854775807 long long的最小值:-...
  • 容易忽视,所以单独开文记录,以示重视。 int的取值范围是:-2147483647~2147483648 总会遇到数字过大超出int范围的情况,注意一下:是21亿4748万多!!!
  • 如果我们使用的整数常量超出int 的表示范围,C 语言规定编译器自动使用 unsigned int 来处理这个常量。如果 unsigned 也不足以表示这个常量的话,编译器就会用 long。如果还表示不了的话,那就依次用 unsigned ...
  • 程序计算结果与计算器运行结果不一致。当计算较大整数的运算时,需要特别注意数制不同的表示范围,防止溢出出错。
  • java中如果int类型超出了它的范围

    千次阅读 2020-07-11 15:49:41
    背景引入 今天老师上课的时候,写了一个循环... int count = 0; while(true) { count ++; if (count<20) { System.out.println("hello world"); } } 小伙伴们,你们不妨先推测一下,如果运行,控制台的
  • C++-int类型整数超出范围后的处理

    千次阅读 2019-02-23 12:30:00
    不像一开始就输入一个超出Int范围的整数时的情况,编译器不会发现超出范围、不会报错(因为这更像一个逻辑错误,是运行中产生的),只会在运行的过程中通过“减模长”的形式使其在范围内。 所以,之后判断Int超出时...
  • 问题:假如一个数 i 的表示范围是-32768 至 32767,在执行i+1后的结果是多少? 解: 首先我们假设另一个数 j =127 ,这样比较好理解。 j = +127 ; 二级制 : j = 0111 1111; (0为正,1为负); 在计算及内部数据都是以...
  • int、short、char 类型超出范围赋值

    千次阅读 2017-09-01 15:45:08
    但是,同样的16位的值,用有符号的short类型保存,就超出范围了,它表示的就是另外一个值,是一个负数。 第二步 ,这个负数是多少呢?先看看有关原码、反码、补码的内容。 这里需要举一个例子。负数在...
  • 但现在的问题是需要的数组很大,超出int的表示范围,第一感觉是换成 long,即 long size = 7; booean[] visited = new boolean[size]; 但这样就直接报错了,提示不能把long转化为int. 还有,像List,...
  • 计算30!后,想要将结果整型数的形式输出,但是已经超出int范围,应该怎样做?希望得到大神的解答!
  • 参数pageNum 传的319227323,导致查询limit 偏移量变成了-2019300299,然后sql报错了,经查询int的取值范围为: -2^31——2^31-1,即-2147483648——2147483647 还有个Integer.parseInt()参数是有最大数限制的,...
  • java中Int范围越界检测

    千次阅读 2020-12-15 10:06:52
    LeetCode上老有String 或者 char[]转int的算法,在计算之前需要分析计算是否会超过int范围。 解决溢出问题有两个思路,第一个思路是通过字符串转换加try catch的方式来解决,第二个思路就是通过数学计算来解决。...
  • java 中int 范围越界校验算法

    千次阅读 2019-08-07 11:20:58
    LeetCode上老有String 或者 char[]转int的算法,在计算之前需要分析计算是否会超过int范围,自己写了一个算法mark 一下。该算法用于 高位乘10 并加低位 操作之前。算法如下: /** * int 是否越界检验算法 ...
  • 首先我们需要了解的是 cint范围 -32,768 到 32,767。 clng范围 -2,147,483,648 到 2,147,483,647。 cint与clng含义: 都可以强制将一个表达式转换成数据类型 cint与clng处理数据的范围: CInt Integer -32,768 至 32...
  • hive数值超出int大小出现负数

    千次阅读 2019-06-12 16:40:31
    今天统计SQL结果出现负数,代码查了一遍,重新跑了代码片段都是正的,找了好久看了结果都是10亿多了,然后看到定义字段为int类型

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 150,605
精华内容 60,242
关键字:

超出int范围