随笔 :
今天写项目的时候 解决了一个bug ,就是javaweb下载文件出现中文时候的乱码问题。在这里插入代码片
String filename= req.getParameter("filename");
ServletContext servletContext =this.getServletContext();
filename= new String(filename.getBytes("ISO-8859-1"),"UTF-8");
问题描述 :n进制转化为m进制
(所以 当m大于10时候就会存在数字向字符的转化的问题 )
#include
#include
#include
#include
using namespace std;
int char_to_int(char str )
{
int num;
if(str>='0'&&str<='9')
{
return str-'0';
}
else
{
return str-'a'+10;
}
}
char int_to_char( int x){
if(x>=0&&x<=9){
return x+'0';
}
else
return x-10+'a';
}
int main()
{
int m,n;
string str;
long number=0;
while(cin>>m>>n){
// m jin'zhi
cin>>str;
for( int i=0;i<str.size();i++){
number=number*n;
number+=char_to_int(str[i]);
} //10进制
vector<char> result;
while(number!=0){
int a =(int )number % m;
result.push_back(int_to_char(a));
number= number/m;
}
for(int i =result.size()-1;i>=0;i--){
cout<<result[i];
}
}
}
求最大公约数问题 ,
#include
#include
#include
#include
using namespace std;
int GCD( int a ,int b){
if(b==0){
return a;
}// b的最大公约数是与a%b相同的
else {
return GCD(b,a%b);
}
}
int main(){
int a ,b;
while(scanf("%d%d",&a,&b)!=EOF){
printf("%d\n",GCD(a,b));
}
return 0;
}
假设 分别为a ,b :
存在下面的内容: a=gm;
b=gn;
那么a b之间一定会存在关系 : a=bk+r;
即:gm=gnk+r; r=g(m-kn)
最小公倍数 :
#include
#include
#include
#include
using namespace std;
// 最小公倍数
int GCD( int a, int b)
{
if(b==0)
{
return a;
}
else
{
return GCD(b,a%b);
}
}
int main(){
int a,b;
while(cin>>a>>b){
cout<<(a*b)/GCD(a,b);
}
// 关于 这个 a/b的问题
}
不妨假设 a=gm ,b=gn ;
因为g为最大的公倍数 ,所以 m n 一定不是因子,所以 gmn最小公倍数。
素数问题
#include
#include
#include
#include
using namespace std;
vector<int> Prime; // 保存素数
bool isPrime[1001];
bool Judge( int num )
{
int a=sqrt(num);
for( int i=2; i<=a; i++)
{
if( num%i==0)
{
return true;
}
else
return false;
}
}
void _printf()
{
for( int i =2; i<1001; i++)
{
if(isPrime[i])
cout<<i;
}
}
void _not_Prime( int i )
{
// i开始的坐标并不是素数
for( int j=i;i*j<=1001;j++ )
{
isPrime[i*j]=1;
}
}
int main()
{
for( int i =2; i<1001; i++)
{
if(Judge(i))
{
isPrime[num]=1;
_not_Prime(i);
}
}
_printf();
return 0;
}
素数问题2 : 求一个范围 内的素数问题 例如 ( 2-10000)
(下面的方法还是不错的)
#include
#include
#include
#include
using namespace std;
vector<int> Prime; // 保存素数
bool isPrime[1001];
void _init( int n)
{
for(int i =1; i<=n; i++)
{
isPrime[i]=true;
}
isPrime[1]=false;
isPrime[0]=false;
for( int i=2;i<=n;i++){
if(!isPrime[i]){
continue;
}
prime.push_back(i);
for( int j=i*i;j<=n;j+=i){
isPrime[j]=false;
}
}
}
int main()
{
_init(1001);
for( int i =2; i<1001; i++)
{
if(isPrime[i]){
cout<<i;
}
}
return 0;
}
一个比较有意思的问题 : 快速幂
例如 求解3的29次方 并不需要乘积 29次数 。因为29 可以利用2进制表示为 3 3^4 3^8 3 ^16 乘,因此可以求其二进制表示方式 a表示为 3的2^k次幂做result=resulta ;之后 a=a;
#include
#include
#include
#include
using namespace std;
int FastExponentiation( int a,int b, int mod) // a的b次幂
{
int answer=1;
while(b!=0)
{
if(b%2==1)
{
answer=answer*a;
answer=answer%mod;
}
b=b/2;
a=a*a;
a=a%mod;
}
}
int main()
{
int a ,intb;
while(scanf("%d%d",&a,&b)){
if(a==0 && b==0){
break;
}
printf("%d\n",FastExponentiation(a,b,1000));
}
return 0;
}