#include<iostream>
#define N 9
using namespace std
unsigned int n,Sqare[N][N]
void Work()
{
int i=0,j=0,Sum=1,Temp=n*n,num=0
while(Sum<=Temp)
{
while(j<n-num)
{
Sqare[i][j]=Sum++
j++
}
j--
while(i<n-num)
{
Sqare[i][j]=Sum++
i++
}
i--
while(j>0+num)
{
Sqare[i][j]=Sum++
j--
}
j++
while(i>0+num)
{
Sqare[i][j]=Sum++
i--
}
i++,num++
}
}
void Print()
{
unsigned int i,j
for(i=0i<ni++)
{
for(j=0j<nj++)
cout<<Sqare[i][j]<<' '
cout<<endl
}
}
int main()
{
cin>>n
Work()
Print()
cin.get()
cin.get()
return 0
}
C 中调用积运算符之后做溢出检测已经太晚,但调用和运算符之后做检测则一点也不迟,所以你可以通过对和运算结果的检测实现能检测溢出的积运算,因为 a * b 既是 a 个 b 的和:
-5000000 * 1374389539 等于 -(5000000 * 1374389539)。括号里是 5000000 个 1374389539 的和。
我把能检测溢出的和运算包在 add( ) 里,然后在 multiply( ) 里重复调用 add( )。
add( ) 怎么检测溢出?
和运算的结果若溢出将导致数值的环绕。上溢导致往下环绕,下溢导致往上环绕。
边界状况:
(1)最轻微的上溢是 INT_MAX + 1 :结果是 INT_MIN。
(2)最严重的上溢是 INT_MAX + INT_MAX :结果是 -2。
(3)最轻微的下溢是 INT_MIN - 1 :结果是 INT_MAX。
(4)最严重的下溢是 INT_MIN - INT_MIN :结果是 0。
结论:
(1)所有上溢结果都小于任何一个操作数。
(2)所有下溢结果都大于任何一个操作数。
所以 add( ) 可以用结果和任意选定的一个参数判断溢出,并以落选的参数判断溢出的方向。
add( ) 无法以返回值举报溢出,所以采用 strtol( ) 的举报方法。
不同于 strtol( ) 的是,若没有溢出,add( ) 会把 0 赋值给 errno。
multiply( ) 在这方面跟 add( ) 一样。
当然,应付溢出的最佳方法还是防范:充分了解数据的范围,选择恰当的变量类型。
#include<stdio.h>#include<string.h>
char str[100]
int IsNumber(char x)
{//判断是否是数字,不是数字,返回0
if(x>='0' &&x<='9')
return 1
else
return 0
}
void main()
{
int i,j
scanf("%s",str)
for(i=0i<strlen(str)i++)
{
if(IsNumber(str[i])==0)
{//如果不是数字,则删除
for(j=ij<=strlen(str)j++)
str[j]=str[j+1]
i--
}
}
strrev(str)//将剩下的逆转
printf("%s\n",str)
}