自守数是指一个数的平方的尾数等于该数自身的自然数。例如:25^2 = 625,76^2 = 5776,9376^2 = 87909376。请求出n(包括n)以内的自守数的个数
解题思路:
1.对[0,n]中的每一位数进行平方以后,取平方数的每一位进行判断。但是这样效率有些低,因为每一个数都要取每一位来判断。
#include
#include
int main()
{int n;while(~scanf("%d", &n)) {long count = 0;for (int i = 0; i <= n; i++){long pow_n = pow(i, 2);int tmp = i;while(tmp){if (tmp%10 != pow_n%10) break;tmp/=10;pow_n/=10;} if(tmp == 0)count++;}printf("%d\n", count);}
return 0;
}
2.设一个base=10,如果i==10了,就说明i已经迈入到两位数了,此时base*=10。然后直接接用pow_n%base即可。(也就是说一位数模十,两位数就模100……)
#include
#include
using namespace std;int main()
{int n=0;int count=0;while(cin>>n)//多组输入{int base=10;for(int i=0;i<=n;i++){long pow_n=pow(i,2);if(i==base)base*=10;if(pow_n%base==i)count++;}cout<
解题思路:
1.编写一个质数判断函数,然后对[2,n]区间内的每一个数都判断一下
2.优化,可以缩小区间,其实只要[2,sqrt(n)]区间内没有n的因数,这个数就肯定是质数
#include
#includeint isprime(int num)
{for(int i=0;i<=sqrt(num);i++){if(num%i==0)return 0;}return 1;
}int main()
{int n=0;int count=0;while(scanf("%d",&n)!=EOF){for(int i=2;iif(isprime(i))count++;}printf("%d",count);}return 0;
}
在一个长为 字符串中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).(从0开始计数)
解题思路
这里给出一个基数排序的思想,既然是字符也就是说最多只有256个数据,建立一个容量为256的字符数组,利用字符的ASCII码值插入到数组的相应位置,然后遍历查找,找到只为1的下标。
int FirstNotRepeatingChar(char* str )
{int len=strlen(str);char arr[256]={0};for(int i=0;i//要判断一下,万一是超长字符可能会溢出if(arr[str[i]]<256){arr[str[i]]+=1;}}//数据录入完毕,查找只数组元素为1的下标for(int j=0;jif(arr[str[j]]==1)return j;}return -1
}
描述
实现一个算法,确定一个字符串 s
的所有字符是否全都不同。
解题思路
这一题的思想和上一题一样,只要数组内的所有元素内容都是1,那么就说明所有的字符都是只出现一次。
class Solution
{
public:bool isUnique(string astr) {int len=strlen(astr);char arr[256]={'\0'};for(int i=0;iif(arr[astr[i]]<256){arr[astr[i]]+=1;}}//开始查找判断,是否有出现两次的数据for(int j=0;jif(arr[astr[j]]>1)return false;}return true;}
};